সুইফটে একটি "আবদ্ধ মান" কী?


155

আমি আইওএস 8 / ওএসএক্স 10.10 জন্য সুইফট শিখছি অনুসরণ করে এই টিউটোরিয়াল , এবং শব্দ " মোড়ানো মান " (অধীনে বেশ কয়েকবার ব্যবহার করা হয় এই অনুচ্ছেদ হিসাবে, অবজেক্টস ও ক্লাস ):

Alচ্ছিক মানগুলির সাথে কাজ করার সময়, আপনি কী লিখতে পারেন? পদ্ধতি, বৈশিষ্ট্য এবং সাবস্ক্রিপশনের মতো ক্রিয়াকলাপের আগে। মান আগে যদি? নীল, সব পরে? উপেক্ষা করা হয় এবং পুরো অভিব্যক্তিটির মান শূন্য হয়। অন্যথায়, alচ্ছিক মান আবদ্ধ হয় , এবং এর পরে সবকিছু? মোড়কানো মানের উপর কাজ করে । উভয় ক্ষেত্রেই, সম্পূর্ণ অভিব্যক্তির মান একটি alচ্ছিক মান।

let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square") 
let sideLength = optionalSquare?.sideLength

আমি এটি পাই না, এবং ভাগ্য ছাড়া ওয়েবে অনুসন্ধান করেছি।

এর অর্থ কী?


সম্পাদন করা

সিজারির উত্তর থেকে, মূল কোড আউটপুট এবং চূড়ান্ত সমাধান (খেলার মাঠে পরীক্ষা করা) এর মধ্যে কিছুটা পার্থক্য রয়েছে:

আসল কোড

আসল কোড

সিজারির সমাধান

সিজারির সমাধান

দ্বিতীয় ক্ষেত্রে আউটপুটে সুপারক্লাসের বৈশিষ্ট্য দেখানো হয়, যখন প্রথম ক্ষেত্রে একটি খালি অবজেক্ট থাকে।

উভয় ক্ষেত্রেই কি ফলাফল একরকম হওয়ার কথা নয়?

সম্পর্কিত প্রশ্নোত্তর: সুইফটে একটি alচ্ছিক মান কী?


1
সেজারির উত্তর স্পট রয়েছে। এছাড়াও, সুইফট- এ আইবুক
ড্যানিয়েল স্টর্ম

@ ড্যানিয়েলস্টোরম অ্যাপস এই আইবুকটি আমার প্রশ্নের লিঙ্কযুক্ত টিউটোরিয়ালের একটি বহনযোগ্য সংস্করণ :)
বিগড

উত্তর:


289

প্রথমে আপনাকে বুঝতে হবে anচ্ছিক প্রকারটি কী। একটি alচ্ছিক টাইপ মূলত এর অর্থ হল ভেরিয়েবল হতে পারে nil

উদাহরণ:

var canBeNil : Int? = 4
canBeNil = nil

প্রশ্ন চিহ্নটি যে সত্য canBeNilহতে পারে তা নির্দেশ করে nil

এটি কাজ করবে না:

var cantBeNil : Int = 4
cantBeNil = nil // can't do this

আপনার ভেরিয়েবলের থেকে মানটি পেতে যদি এটি alচ্ছিক হয় তবে আপনাকে এটিকে আবদ্ধ করতে হবে । এর অর্থ হ'ল শেষে একটি বিস্ময়বোধক পয়েন্ট স্থাপন করা।

var canBeNil : Int? = 4
println(canBeNil!)

আপনার কোডটি দেখতে এমন হওয়া উচিত:

let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional square") 
let sideLength = optionalSquare!.sideLength

একটি সাইডনোট:

আপনি প্রশ্ন চিহ্নের পরিবর্তে বিস্মৃত চিহ্নটি ব্যবহার করে স্বয়ংক্রিয়ভাবে মোড়কানোর জন্য বিকল্পগুলি ঘোষণা করতে পারেন।

উদাহরণ:

var canBeNil : Int! = 4
print(canBeNil) // no unwrapping needed

সুতরাং আপনার কোড ঠিক করার বিকল্প উপায় হ'ল:

let optionalSquare: Square! = Square(sideLength: 2.5, name: "optional square") 
let sideLength = optionalSquare.sideLength

সম্পাদনা করুন:

আপনি যে পার্থক্যটি দেখছেন তা হ'ল option চ্ছিক মানটি আবৃত হওয়ার লক্ষণ । এর উপরে আরও একটি স্তর রয়েছে। মোড়ানো কারণ এটি ভাল হল, মোড়ানো সংস্করণ মাত্র সোজা বস্তুর দেখায়।

একটি দ্রুত খেলার মাঠের তুলনা:

খেলার মাঠ

প্রথম এবং দ্বিতীয় ক্ষেত্রে, অবজেক্টটি স্বয়ংক্রিয়ভাবে মোড়কানো হচ্ছে না, সুতরাং আপনি দুটি "স্তর" ( {{...}}) দেখছেন , অন্যদিকে তৃতীয় ক্ষেত্রে আপনি কেবল একটি স্তর ( {...}) দেখতে পাচ্ছেন কারণ বস্তুটি স্বয়ংক্রিয়ভাবে মোড়কানো হচ্ছে।

প্রথম কেস এবং দ্বিতীয় দুটি ক্ষেত্রে পার্থক্য optionalSquareহ'ল যদি সেট করা থাকে তবে দ্বিতীয় দুটি ক্ষেত্রে আপনাকে রানটাইম ত্রুটি দেয় nil। প্রথম ক্ষেত্রে সিনট্যাক্স ব্যবহার করে আপনি এরকম কিছু করতে পারেন:

if let sideLength = optionalSquare?.sideLength {
    println("sideLength is not nil")
} else {
    println("sidelength is nil")
}

1
সুস্পষ্ট ব্যাখ্যার জন্য ধন্যবাদ! আমার প্রশ্নের অন্তর্ভুক্ত কোডটি অ্যাপলের টিউটোরিয়াল (প্রশ্নের লিঙ্ক) থেকে উদ্ধৃত হয়েছে এবং আমি অনুমান করি যে এটি হিসাবে রয়েছে ঠিক তেমন কাজ করবে (এবং এটি করে)। যদিও, আপনার চূড়ান্ত সমাধান এবং আসলটি বিভিন্ন ফলাফল দেয় (আমার সম্পাদনা দেখুন)। কোন চিন্তা?
বিগুড

2
কুল। দুর্দান্ত ব্যাখ্যা। যদিও আমি এখনও বিভ্রান্ত। আমি কেন একটি alচ্ছিক মান ব্যবহার করতে চাই? এটি কখন কার্যকর? অ্যাপল কেন এই আচরণ এবং সিনট্যাক্স তৈরি করেছিল?
টড লেহম্যান

1
এটি শ্রেণীর বৈশিষ্ট্যের ক্ষেত্রে বিশেষত প্রাসঙ্গিক। init()ক্লাসের ক্রিয়াকলাপে সুইফটকে সমস্ত অ-optionচ্ছিক পদ্ধতি শুরু করতে হবে । আমি অ্যাপল দ্বারা প্রকাশিত সুইফট বইয়ের অধ্যায়গুলি "দ্য বেসিকস" (বিকল্পগুলি কভার করে), "ইনিশিয়ালাইজেশন" এবং "ptionচ্ছিক চেইনিং" পড়ার পরামর্শ দিচ্ছি।
সেজারি ওয়াজিক

2
@ টাডলহম্যান অ্যাপল আপনাকে আরও সুরক্ষিত কোড লিখতে সহায়তা করার জন্য এটি তৈরি করেছে। যেমন জাভাতে কোনও প্রোগ্রাম ক্র্যাশ করার সমস্ত নাল পয়েন্টার ব্যতিক্রম কল্পনা করুন কারণ কেউ নাল পরীক্ষা করতে ভুলে গেছে। অথবা অবজেক্টিভ-সি-তে অদ্ভুত আচরণ কারণ আপনি শূন্যতার জন্য পরীক্ষা করতে ভুলে গেছেন। Ptionচ্ছিক প্রকারের সাথে আপনি শূন্যতার সাথে ডিল করতে ভুলবেন না। সংকলক আপনাকে এটি মোকাবেলা করতে বাধ্য করে।
এরিক এনহিম

5
@ অ্যাডমস্মিথ - জাভা ব্যাকগ্রাউন্ড থেকে আসার পরে আমি অবশ্যই বিকল্পগুলির ব্যবহার দেখতে পাচ্ছি ... তবে একটি উদ্দেশ্য-সি ব্যাকগ্রাউন্ড থেকেও এসেছি (খুব সাম্প্রতিককালে), এখনও এটির ব্যবহার দেখতে আমার সমস্যা হচ্ছে, কারণ উদ্দেশ্য- সি আপনাকে স্পষ্টভাবে শূন্য বস্তুগুলিতে বার্তা প্রেরণের অনুমতি দেয়। হুম। আমি কাউকে এই কোডটি সংক্ষিপ্ত এবং যেটি ব্যবহার না করে এমন সমতুল্য কোডের চেয়ে আরও সুরক্ষিত করতে সহায়তা করে সেগুলির একটি উদাহরণ লিখতে দেখতে চাই। আমি বলছি না যে তারা দরকারী নয়; আমি কেবল বলছি আমি এখনও "এটি পাই না"।
টড লেহম্যান

17

বিদ্যমান সঠিক উত্তরটি দুর্দান্ত, তবে আমি দেখতে পেয়েছি যে এটিকে পুরোপুরি বুঝতে আমার জন্য আমার একটি ভাল উপমা প্রয়োজন, কারণ এটি একটি খুব বিমূর্ত এবং উদ্ভট ধারণা।

সুতরাং, আমাকে সঠিক উত্তর ছাড়াও আলাদা দৃষ্টিভঙ্গি দিয়ে সেই "ডান-ব্রেইন্ড" (চাক্ষুষ চিন্তা) বিকাশকারীদের সহায়তা করতে দিন out এখানে একটি ভাল উপমা যা আমাকে অনেক সাহায্য করেছিল।

জন্মদিনের বর্তমানের মোড়ক উপমা

কড়া, শক্ত, রঙিন মোড়কে আসা জন্মদিনের উপহারের মতো বিকল্প হিসাবে ভাবুন।

আপনি বর্তমান আনপ্রেপ না করা পর্যন্ত মোড়কের ভিতরে কিছু আছে কিনা আপনি জানেন না - সম্ভবত ভিতরে কিছু নেই! যদি ভিতরে কিছু থাকে তবে এটি অন্য একটি উপস্থিত হতে পারে, যা এছাড়াও আবৃত থাকে এবং এতে কিছু নাও থাকতে পারে । এমনকি মোড়ানো ছাড়াও আর কিছু নেই বলে আবিষ্কার করতে আপনি 100 টি নেস্টেড উপহারগুলি আনপ্রেপ করতে পারেন

তাহলে ঐচ্ছিক এর মান নয় nil, এখন আপনি সম্বলিত একটি বক্স অবতীর্ণ করেছি কিছু । তবে, বিশেষত যদি মানটি স্পষ্টভাবে টাইপ না করা হয় এবং এটি একটি পরিবর্তনশীল এবং পূর্বনির্ধারিত ধ্রুবক না হয় তবে বাক্সটিতে কী রয়েছে, এটি কী ধরণের , বা কী কী তা সম্পর্কে সুনির্দিষ্ট কিছু জানতে পারার আগে আপনাকে বাক্সটি খোলার দরকার হতে পারে প্রকৃত মান হয়।

বক্স কি আছে?! উপমা

আপনি ভেরিয়েবলটি আন-আপ করার পরেও, আপনি এখনও SE7EN-শেষ দৃশ্যে ব্র্যাড পিটের মতো ( সতর্কতা : স্পোলার্স এবং খুব রে-রেটযুক্ত মূর্খ ভাষা এবং হিংস্র), কারণ আপনি বর্তমানকে আবদ্ধ করার পরেও আপনি নিম্নলিখিত পরিস্থিতিতে আছেন: আপনার কাছে এখন nilবা একটি বাক্স রয়েছে যা কিছু রয়েছে (তবে আপনি কী জানেন না)।

আপনি কিছু জানেন । উদাহরণস্বরূপ, আপনি যদি ভেরিয়েবলটি টাইপ হিসাবে ঘোষণা করেন [Int:Any?], তবে আপনি জানতে পারবেন আপনার কোনও পূর্ণসংখ্যার সাবস্ক্রিপ্ট সহ একটি (সম্ভাব্য খালি) অভিধান রয়েছে যা কোনও পুরানো টাইপের মোড়কযুক্ত সামগ্রী দেয়।

এজন্যই সুইফটে সংগ্রহের ধরণের (ডিকোরিজ এবং অ্যারে) সাথে ডিল করা এক ধরণের লোমশ পেতে পারে।

বিন্দু ক্ষেত্রে:

typealias presentType = [Int:Any?]

func wrap(i:Int, gift:Any?) -> presentType? {
    if(i != 0) {
        let box : presentType = [i:wrap(i-1,gift:gift)]
        return box
    }
    else {
        let box = [i:gift]
        return box
    }
}

func getGift() -> String? {
    return "foobar"
}

let f00 = wrap(10,gift:getGift())

//Now we have to unwrap f00, unwrap its entry, then force cast it into the type we hope it is, and then repeat this in nested fashion until we get to the final value.

var b4r = (((((((((((f00![10]! as! [Int:Any?])[9]! as! [Int:Any?])[8]! as! [Int:Any?])[7]! as! [Int:Any?])[6]! as! [Int:Any?])[5]! as! [Int:Any?])[4]! as! [Int:Any?])[3]! as! [Int:Any?])[2]! as! [Int:Any?])[1]! as! [Int:Any?])[0])

//Now we have to DOUBLE UNWRAP the final value (because, remember, getGift returns an optional) AND force cast it to the type we hope it is

let asdf : String = b4r!! as! String

print(asdf)

চমৎকার 😊 😊😊 😊 😊😊 😊 😊😊
স্যামসোল

সাদৃশ্য প্রেম! সুতরাং, বাক্সগুলি আনপ্রেটের আরও ভাল উপায় কি আর নেই? আপনার কোড উদাহরণে
ডেভিড টি।


আমাকে বিভ্রান্ত করার জন্য ধন্যবাদ .... কোন ধরণের প্রোগ্রামার জন্মদিনের উপস্থাপনা দেয় যা যাইহোক খালি? কিন্ডা মানে
ডেল্টাফ্লাট

পুনঃটুইট
এমএসএম

13

টাইপ সুরক্ষায় সুইফট একটি উচ্চ প্রিমিয়াম রাখে। পুরো সুইফট ভাষাটি সুরক্ষার কথা মাথায় রেখে তৈরি করা হয়েছিল। এটি সুইফটের অন্যতম বৈশিষ্ট্য এবং এটি আপনাকে খোলার বাহুতে স্বাগত জানানো উচিত। এটি পরিষ্কার, পঠনযোগ্য কোডের বিকাশে সহায়তা করবে এবং আপনার অ্যাপ্লিকেশনটিকে ক্রাশ থেকে রক্ষা করতে সহায়তা করবে।

সুইফটে সমস্ত বিকল্প ?প্রতীক দিয়ে চিহ্নিত করা হয়েছে। সেটিং দ্বারা ?টাইপ যার মাধ্যমে আপনি যেমন ঐচ্ছিক আপনি মূলত হয় প্রকাশক করছে নামের পরে ভোটদান টাইপ হিসাবে এই না যা আগে ?, কিন্তু এর পরিবর্তে যেমন ঐচ্ছিক প্রকার।


নোট: একটি পরিবর্তনশীল বা টাইপ Intহয় না হিসাবে একই Int?। এগুলি দুটি ভিন্ন ধরণের যা একে অপরের উপর পরিচালিত হতে পারে না।


Ptionচ্ছিক ব্যবহার

var myString: String?

myString = "foobar"

এর অর্থ এই নয় যে আপনি কোনও ধরণের সাথে কাজ করছেন String। এর অর্থ হ'ল আপনি এক ধরণের String?(স্ট্রিং ptionচ্ছিক বা ptionচ্ছিক স্ট্রিং) সাথে কাজ করছেন। আসলে, আপনি যখনই চেষ্টা করবেন

print(myString)

রানটাইমে, ডিবাগ কনসোলটি মুদ্রণ করবে Optional("foobar")। " Optional()" অংশটি ইঙ্গিত করে যে এই চলকটির রানটাইমের সময় কোনও মান থাকতে পারে বা নাও থাকতে পারে, তবে ঠিক এখনই "ফুবার" স্ট্রিংটি রয়েছে। Optional()"চ্ছিক মানটিকে "মোড়কানো" বলা না করা অবধি এই " " ইঙ্গিতটি থাকবে।

একটি alচ্ছিক মোড়ক মানে আপনি এখন সেই ধরণের অ- alচ্ছিক হিসাবে কাস্ট করছেন। এটি একটি নতুন ধরণের উত্পন্ন করবে এবং নতুন অ-withinচ্ছিক প্রকারের জন্য thatচ্ছিকের মধ্যে থাকা মানটিকে নির্ধারণ করবে। এইভাবে আপনি সেই পরিবর্তনশীলটির উপর ক্রিয়াকলাপ সম্পাদন করতে পারেন কারণ এটির একটি দৃ value় মান থাকার সংকলক দ্বারা গ্যারান্টি দেওয়া হয়েছে।


শর্তসাপেক্ষে আন-র্যাপিং চেক করবে যে the চ্ছিক মানটি আছে কি nilনা। যদি এটি না হয় nilতবে একটি নতুন তৈরি করা ধ্রুবক ভেরিয়েবল আসবে যা মান নির্ধারিত হবে এবং অ- alচ্ছিক ধ্রুবকে আবদ্ধ করা হবে। এবং সেখান থেকে আপনি নিরাপদে ifব্লকের অ-alচ্ছিক ব্যবহার করতে পারেন ।

দ্রষ্টব্য: আপনি শর্তসাপেক্ষে মোড়ক না দেওয়া ধ্রুবকটিকে যে নামটি unচ্ছিকভাবে ভেরিয়েপিং করছেন তার একই নাম দিতে পারেন।

if let myString = myString {
    print(myString)
    // will print "foobar"
}

শর্তসাপেক্ষে আনারপিং বিকল্পগুলি হ'ল একটি valueচ্ছিকের মানটি অ্যাক্সেস করার সবচেয়ে সহজ উপায় কারণ এটিতে যদি শূন্য মান থাকে তবে আইএফ ব্লকের মধ্যে থাকা সমস্ত কিছুই কার্যকর হবে না। অবশ্যই, যদি কোনও বিবৃতি মত, আপনি অন্য একটি ব্লক অন্তর্ভুক্ত করতে পারেন

if let myString = myString {
    print(myString)
    // will print "foobar"
}
else {
    print("No value")
}

!("ঠুং শব্দ") অপারেটর হিসাবে পরিচিত যা নিযুক্ত করে জোর করে আন-র্যাপিং করা হয় । এটি কম নিরাপদ তবে তবুও আপনার কোডটি সংকলনের অনুমতি দেয়। তবে আপনি যখনই ব্যাং অপারেটরটি ব্যবহার করেন তখন অবশ্যই আপনার অবশ্যই 1000% নির্দিষ্ট হতে হবে যে আপনার পরিবর্তনশীলটিতে জোর করে আন-র্যাপিংয়ের আগে একটি দৃ value় মান থাকে contain

var myString: String?

myString = "foobar"

print(myString!)

এটি উপরেরটি সম্পূর্ণ বৈধ সুইফট কোড code এটি myString"foobar" হিসাবে সেট করা হয়েছিল এর মান ছাপে । ব্যবহারকারী foobarকনসোলে মুদ্রিত দেখতে পাবেন এবং এটি প্রায় এটিই। তবে ধরা যাক মানটি কখনই সেট করা হয়নি:

var myString: String?

print(myString!) 

এখন আমাদের হাতে আলাদা পরিস্থিতি। অবজেক্টিভ-সি-এর বিপরীতে, যখনই জোর করে একটি alচ্ছিক আন-rapাক করার চেষ্টা করা হয়, এবং alচ্ছিক সেট করা হয়নি এবং হয় nil, আপনি যখন নিজের অ্যাপ্লিকেশনটির অভ্যন্তরে কী ঘটেছিল তা ক্র্যাশ হয়ে যায় তা দেখার জন্য যখন alচ্ছিক আনারপ করার চেষ্টা করবেন।


মোড়ক W / টাইপ কাস্টিং । যেমনটি আমরা আগেই বলেছি যে আপনি যখন unwrappingtheচ্ছিক হন তখন আপনি বাস্তবে একটি অ-optionচ্ছিক প্রকারে কাস্টিং করছেন, আপনি অ-optionচ্ছিকটিকে অন্য কোনও ধরণেরও কাস্ট করতে পারেন। উদাহরণ স্বরূপ:

var something: Any?

আমাদের কোডে কোথাও ভেরিয়েবলটি somethingকিছু মান সহ সেট করবে। হতে পারে আমরা জেনেরিক ব্যবহার করছি বা অন্য কোনও যুক্তি রয়েছে যা চলছে যা এটি পরিবর্তিত হতে পারে। সুতরাং পরে আমাদের কোডে আমরা ব্যবহার করতে চাই somethingতবে এটি অন্যরকম হলেও এটির সাথে অন্যরকম আচরণ করতে সক্ষম হবো। এই ক্ষেত্রে আপনি asকীওয়ার্ডটি এটি নির্ধারণ করতে ব্যবহার করতে চাইবেন :

দ্রষ্টব্য: asঅপারেটরটি আপনি সুইফটে কাস্টটি টাইপ করেন।

// Conditionally
if let thing = something as? Int {
    print(thing) // 0
}

// Optionally
let thing = something as? Int
print(thing) // Optional(0)

// Forcibly
let thing = something as! Int
print(thing) // 0, if no exception is raised

লক্ষ্য করুন দুই এর মধ্যে পার্থক্য asকীওয়ার্ড। আগের মতো যখন আমরা বাধ্যতামূলকভাবে একটি alচ্ছিক আনারপ্যাপ করেছিলাম তখন আমরা এটি করতে !ব্যাং অপারেটরটি ব্যবহার করি। এখানে আপনি একই জিনিস করতে হবে কিন্তু এর পরিবর্তে এইমাত্র কোনো অ- ঐচ্ছিক হিসাবে ভোটদান আপনি এটা নামেও ভোটদান করছে Int। এবং এটি অবশ্যই ডাউন কাস্ট করতে সক্ষম হবে Int, অন্যথায়, যখন ব্যাং অপারেটরটি ব্যবহার nilকরা হবে তখন মানটি যখন আপনার অ্যাপ্লিকেশনটি ক্র্যাশ হয়ে যায়।

এবং এই ভেরিয়েবলগুলি কোনওভাবে বা গাণিতিক ক্রিয়াকলাপে ব্যবহার করার জন্য এগুলি করার জন্য তাদের অবশ্যই আবদ্ধ হওয়া আবশ্যক।

উদাহরণস্বরূপ, সুইফটে কেবল একই ধরণের বৈধ সংখ্যা ডেটা টাইপ একে অপরের উপর পরিচালিত হতে পারে। আপনি যখন কোনও প্রকারটি কাস্ট করেন তখন আপনি as!সেই পরিবর্তনশীলটিকে হ্রাস করতে বাধ্য করছেন যদিও আপনি নিশ্চিত যে এটি সেই ধরণের, সুতরাং আপনার অ্যাপ্লিকেশনটি ক্র্যাশ করে চালানো নিরাপদ নয়। এটি ঠিক আছে যতক্ষণ না চলকটি প্রকৃতপক্ষে সেই ধরণের হয় যার জন্য আপনি এটি নিক্ষেপ করছেন, অন্যথায় আপনার হাতে একটি জগাখিচুড়ি থাকবে।

তবুও এর সাথে কাস্টিং as!আপনার কোডটি সংকলনের অনুমতি দেবে। একটি কাস্টিং দ্বারা as?একটি ভিন্ন গল্প। আসলে, as?আপনার ঘোষণা Intসব একসাথে একটি সম্পূর্ণ ভিন্ন ডাটা টাইপ হিসেবে।

এখন এটা Optional(0)

এবং আপনি যদি কখনও নিজের গৃহকর্মের মতো কিছু লেখার চেষ্টা করেন

1 + Optional(1) = 2

আপনার গণিতের শিক্ষক সম্ভবত আপনাকে একটি "এফ" দিয়েছিলেন। সুইফট একই। সুইড ব্যতীত আপনাকে গ্রেড দেওয়ার পরিবর্তে মোটেই সংকলন করবে না। কারণ দিন শেষে alচ্ছিক বাস্তবে শূন্য হতে পারে

সুরক্ষা প্রথম বাচ্চাদের।


.চ্ছিক প্রকারের সুন্দর ব্যাখ্যা। আমার জন্য পরিষ্কার জিনিসগুলিতে সাহায্য করেছে।
টোব_সটা

0

'?' এর অর্থ alচ্ছিক শৃঙ্খলা প্রকাশের অর্থ

'!' অর্থ জোর-মান
এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.