নাম দ্বারা কল করুন: => টাইপ করুন
=> Typeস্বরলিপি কল-বাই-নাম, যা এক ঘোরা নানাভাবে পরামিতি প্রেরণ করা সম্ভব। আপনি যদি তাদের সাথে পরিচিত না হন তবে আমি উইকিপিডিয়া নিবন্ধটি পড়ার জন্য কিছুটা সময় নেওয়ার পরামর্শ দিই, যদিও আজকাল এটি বেশিরভাগ কল-বাই-ভ্যালু এবং কল-বাই-রেফারেন্স।
এর অর্থ হ'ল যা উত্তীর্ণ হবে তা ফাংশনের অভ্যন্তরে মান নামের জন্য প্রতিস্থাপিত হয়। উদাহরণস্বরূপ, এই ফাংশনটি গ্রহণ করুন:
def f(x: => Int) = x * x
আমি যদি এটিকে ডাকি
var y = 0
f { y += 1; y }
তারপরে কোডটি এভাবে কার্যকর করা হবে
{ y += 1; y } * { y += 1; y }
যদিও এটি শনাক্তকারী নামের সংঘর্ষের ঘটলে কী ঘটবে তা তুলে ধরে। চিরাচরিত কল-বাই-নামে, নাম সংঘর্ষ এড়ানোর জন্য ক্যাপচার-এড়ানো এস্টিটিউশন নামক একটি প্রক্রিয়া ঘটে। স্কালায়, তবে, একই ফলাফলের সাথে এটি অন্যভাবে প্রয়োগ করা হয়েছে - প্যারামিটারের ভিতরে সনাক্তকারী নামগুলি কল করা ফাংশনটিতে শ্যাডো আইডেন্টিফায়ারকে উল্লেখ করতে পারে না বা ছায়া সনাক্তকারী হতে পারে।
কল-বাই-নাম সম্পর্কিত আরও কিছু পয়েন্ট রয়েছে যা আমি অন্য দুটি ব্যাখ্যা করার পরে বলব।
0-arity ফাংশন: () => প্রকার
সিনট্যাক্সটি () => Typeএ এর ধরণের জন্য বোঝায় Function0। এটি এমন কোনও ফাংশন যা কোনও পরামিতি নেয় না এবং কোনও কিছু ফেরত দেয়। এটি পদ্ধতিটিকে কল করে বলার সমতুল্য size()- এটি কোনও পরামিতি নেয় না এবং কোনও নম্বর দেয়।
তবে এটি আকর্ষণীয় যে এই বর্ননাটি একটি বেনাম ফাংশন আক্ষরিক জন্য সিনট্যাক্সের সাথে খুব মিল , যা কিছু বিভ্রান্তির কারণ। উদাহরণ স্বরূপ,
() => println("I'm an anonymous function")
arity 0 একটি বেনামী ফাংশন আক্ষরিক, যার হয় টাইপ হয়
() => Unit
সুতরাং আমরা লিখতে পারে:
val f: () => Unit = () => println("I'm an anonymous function")
তবে মানটির সাথে ধরণের বিভ্রান্ত না করা গুরুত্বপূর্ণ।
ইউনিট => টাইপ করুন
এটি আসলে মাত্র একটি Function1, যার প্রথম প্যারামিটারটি টাইপ Unit। এটি লেখার অন্যান্য উপায় হতে পারে (Unit) => Typeবা Function1[Unit, Type]। বিষয়টি হ'ল ... এটি যা চায় তা কখনই সম্ভব না। এই Unitধরণের মূল উদ্দেশ্যটি এমন একটি মানকে নির্দেশ করছে যা একটির মধ্যে আগ্রহী নয়, সুতরাং সেই মানটি গ্রহণ করার কোনও অর্থ নেই ।
উদাহরণস্বরূপ, বিবেচনা করুন
def f(x: Unit) = ...
একজন সম্ভবত কী করতে পারে x? এর কেবলমাত্র একক মান থাকতে পারে, সুতরাং এটির গ্রহণের প্রয়োজন নেই। একটি সম্ভাব্য ব্যবহার হ'ল চেইন ফাংশনগুলি ফিরবে Unit:
val f = (x: Unit) => println("I'm f")
val g = (x: Unit) => println("I'm g")
val h = f andThen g
কারণ andThenকেবলমাত্র এতে সংজ্ঞায়িত করা হয় Function1এবং আমরা যে ক্রিয়াকলাপগুলি শৃঙ্খলাবদ্ধ করছি সেগুলি আবার ফিরে আসছে Unit, তাদের Function1[Unit, Unit]শৃঙ্খলাবদ্ধ করতে সক্ষম হওয়ার জন্য আমাদের তাদের সংজ্ঞা দিতে হয়েছিল।
বিভ্রান্তির উত্স
বিভ্রান্তির প্রথম উত্সটি টাইপ এবং আক্ষরিকের মধ্যে সাদৃশ্যটি ভাবছে যা 0-arity ফাংশনগুলির জন্য উপস্থিত রয়েছে নাম অনুসারে কল করার জন্যও বিদ্যমান। অন্য কথায়, যে চিন্তা, কারণ
() => { println("Hi!") }
() => Unitতাহলে আক্ষরিক হয়
{ println("Hi!") }
আক্ষরিক হবে => Unit। এইটা না. এটি কোডের একটি ব্লক, আক্ষরিক নয়।
বিভ্রান্তির আরেকটি উত্স হ'ল এই Unitধরণের মান লেখা হয় ()যা 0-arity প্যারামিটার তালিকার মতো দেখাচ্ছে (তবে এটি নয়)।
case class Scheduled(time: Int)(callback: => Unit)। এটি কাজ করে কারণ গৌণ প্যারামিটারের তালিকাটি প্রকাশ্যে প্রকাশিত হয় নি, বা এটি উত্পন্নequals/hashCodeপদ্ধতিতে অন্তর্ভুক্ত নয় ।