শ্রেণীর সংজ্ঞা:
valবা varক্লাস প্যারামিটারগুলি থেকে বাদ দেওয়া যেতে পারে যা প্যারামিটারটিকে ব্যক্তিগত করে তুলবে।
ভের বা ভ্যাল যোগ করার ফলে এটি সর্বজনীন হতে পারে (অর্থাত্ পদ্ধতি অ্যাকসেসর এবং মিউটরগুলি উত্পন্ন হয়)।
{} যদি শ্রেণীর কোনও দেহ না থাকে, তবে তা বাদ দেওয়া যেতে পারে,
class EmptyClass
ক্লাস ইনস্ট্যান্টেশন:
জেনেরিক পরামিতি বাদ দেওয়া যেতে পারে যদি তারা সংকলক দ্বারা অনুমান করা যায়। তবে মনে রাখবেন, যদি আপনার ধরণগুলি মেলে না, তবে টাইপ পরামিতিটি সর্বদা কার্যকর হয় যাতে এটি মেলে। সুতরাং প্রকারটি নির্দিষ্ট করে না দিয়ে, আপনি যা প্রত্যাশা করেন তা পাবেন না - যা দেওয়া হয়েছে
class D[T](val x:T, val y:T);
এটি আপনাকে একটি টাইপ ত্রুটি দেবে (Int পাওয়া গেছে, প্রত্যাশিত স্ট্রিং)
var zz = new D[String]("Hi1", 1) // type error
যদিও এটি কাজ করে:
var z = new D("Hi1", 1)
== D{def x: Any; def y: Any}
কারণ প্যারামিটার, টি, দুটি - যেকোন, এর মধ্যে সর্বনিম্ন সাধারণ সুপারটাইপ হিসাবে অনুমান করা হয়।
ফাংশন সংজ্ঞা:
= যদি ফাংশনটি ইউনিটটি (কিছু না) দেয় তবে বাদ দেওয়া যাবে।
{}যদি ফাংশনটি একক বিবৃতি হয় তবে ফাংশনটির বডি বাদ দেওয়া যেতে পারে, তবে কেবলমাত্র বিবৃতিটি কোনও মান (আপনার =সাইন দরকার ) প্রত্যাবর্তন করলেই ,
def returnAString = "Hi!"
তবে এটি কাজ করে না:
def returnAString "Hi!" // Compile error - '=' expected but string literal found."
ফাংশনটির রিটার্ন টাইপ বাদ দেওয়া যেতে পারে যদি এটি অনুমান করা যায় (একটি পুনরাবৃত্ত পদ্ধতিতে তার রিটার্নের ধরণ নির্দিষ্ট থাকতে হবে)।
() যদি ফাংশনটি কোনও যুক্তি না নেয় তবে বাদ দেওয়া যেতে পারে,
def endOfString {
return "myDog".substring(2,1)
}
যা কনভেনশন দ্বারা এমন কোনও পদ্ধতির জন্য সংরক্ষিত রয়েছে যার কোনও পার্শ্ব প্রতিক্রিয়া নেই - পরে এটি আরও।
()নাম প্যারাম্যান্টারের দ্বারা পাস সংজ্ঞায়িত করার সময় আসলে সে প্রতি ছাড়েনি, তবে এটি আসলে একটি সম্পূর্ণ শব্দার্থভাবে আলাদা স্বরলিপি, এটি হ'ল
def myOp(passByNameString: => String)
বলছেন যে MyOp একটি পাস-বাই-প্যারামিটার নেয়, যার ফলস্বরূপ ফাংশন পরামিতিগুলির বিপরীতে স্ট্রিংয়ের (অর্থাৎ এটি একটি কোড ব্লক হতে পারে যা একটি স্ট্রিং ফিরিয়ে দেয়) ফলাফল করে,
def myOp(functionParam: () => String)
যা বলে যে myOpএকটি ফাংশন নেয় যা শূন্য পরামিতি রয়েছে এবং একটি স্ট্রিং প্রদান করে।
(মনে মনে, পাস-বাই-প্যারামিটারগুলি ফাংশনগুলিতে সংকলিত হয়; এটি কেবল সিনট্যাক্সকে আরও সুন্দর করে তোলে))
() যদি ফাংশনটি কেবল একটি যুক্তি নেয় তবে ফাংশন প্যারামিটার সংজ্ঞাতে ফেলে দেওয়া যেতে পারে, উদাহরণস্বরূপ:
def myOp2(passByNameString:(Int) => String) { .. } // - You can drop the ()
def myOp2(passByNameString:Int => String) { .. }
তবে যদি এটি একাধিক যুক্তি লাগে তবে আপনাকে অবশ্যই ():
def myOp2(passByNameString:(Int, String) => String) { .. }
বিবৃতি:
.অপারেটর স্বরলিপি ব্যবহার করতে বাদ দেওয়া যেতে পারে, যা কেবল ইনফিক্স অপারেটরগুলির জন্য ব্যবহার করা যেতে পারে (পদ্ধতিগুলির অপারেটরগুলি যেগুলি আর্গুমেন্ট গ্রহণ করে)। দেখুন দানিয়েলের উত্তর আরও তথ্যের জন্য।
. পোস্টফিক্স ফাংশন তালিকার লেজের জন্যও বাদ দেওয়া যেতে পারে
() পোস্টফিক্স অপারেটরদের তালিকার জন্য বাদ দেওয়া যেতে পারে ail
() হিসাবে সংজ্ঞায়িত পদ্ধতি ব্যবহার করা যাবে না:
def aMethod = "hi!" // Missing () on method definition
aMethod // Works
aMethod() // Compile error when calling method
কারণ এই স্বীকৃতিটি এমন পদ্ধতিগুলির জন্য কনভেনশন দ্বারা সংরক্ষিত রয়েছে যার কোনও পার্শ্ব প্রতিক্রিয়া নেই, যেমন তালিকা # লেজ (যেমন কোনও পার্শ্ব প্রতিক্রিয়াবিহীন কোনও ক্রমের অনুরোধের অর্থ ফাংশনটির তার প্রত্যাবর্তনের মান বাদে কোনও পর্যবেক্ষণযোগ্য প্রভাব নেই)।
() একক যুক্তিতে পাস করার পরে অপারেটর স্বরলিপিটির জন্য বাদ দেওয়া যেতে পারে
() পোস্টফিক্স অপারেটরগুলি ব্যবহারের প্রয়োজন হতে পারে যা কোনও বিবৃতি শেষে নেই
() নেস্টেড বিবৃতি, বেনামে ফাংশনগুলির সমাপ্তি বা অপারেটরগুলির জন্য যা একাধিক প্যারামিটার নেয় তার জন্য প্রয়োজন হতে পারে
একটি ফাংশন যা কোনও ফাংশনকে কল করার সময়, আপনি অভ্যন্তরীণ ফাংশন সংজ্ঞা থেকে () বাদ দিতে পারবেন না, উদাহরণস্বরূপ:
def myOp3(paramFunc0:() => String) {
println(paramFunc0)
}
myOp3(() => "myop3") // Works
myOp3(=> "myop3") // Doesn't work
কোনও নাম-প্যারামিটার নিয়ে যাওয়া কোনও ফাংশন কল করার সময়, আপনি আর্গুমেন্টটিকে প্যারামিটার-কম বেনাম ফাংশন হিসাবে নির্দিষ্ট করতে পারবেন না। উদাহরণস্বরূপ, প্রদত্ত:
def myOp2(passByNameString:Int => String) {
println(passByNameString)
}
আপনি এটি হিসাবে কল করতে হবে:
myOp("myop3")
অথবা
myOp({
val source = sourceProvider.source
val p = myObject.findNameFromSource(source)
p
})
কিন্তু না:
myOp(() => "myop3") // Doesn't work
আইএমও, পুনরায় ব্যবহারের জন্য ড্রপ রিটার্নের ধরণের অতিরিক্ত ব্যবহার ক্ষতিকারক হতে পারে। কোডে সুস্পষ্ট তথ্যের অভাবের কারণে হ্রাসযোগ্য পাঠযোগ্যতার একটি ভাল উদাহরণের জন্য স্পেসিফিকেশনটি দেখুন। ভেরিয়েবলের ধরণ কী বাদাম হতে পারে তা প্রকৃতপক্ষে নির্ধারণের জন্য ইন্ডিরেশনের স্তরের সংখ্যা। আশা করি আরও ভাল সরঞ্জামগুলি এই সমস্যাটিকে এড়াতে এবং আমাদের কোডকে সংক্ষিপ্ত রাখতে পারে।
(ঠিক আছে, আরও সম্পূর্ণ, সংক্ষিপ্ত উত্তর সংকলনের সন্ধানে (আমি যদি কিছু মিস করেছি, বা ভুল কিছু পেয়েছি / অনুগ্রহ করে মন্তব্য করুন)), আমি উত্তরের শুরুতে যুক্ত করেছি Please দয়া করে নোট করুন এটি কোনও ভাষা নয় স্পেসিফিকেশন, সুতরাং আমি এটিকে একাডেমিকভাবে সঠিকভাবে তৈরি করার চেষ্টা করছি না - আরও একটি রেফারেন্স কার্ডের মতো))