আমি এ সম্পর্কে একবার লেখার চেষ্টা করেছি, তবে নিয়মগুলি কিছুটা বিচ্ছিন্ন হওয়ায় আমি শেষ পর্যন্ত ছেড়ে দিয়েছি। মূলত, আপনাকে এটির হ্যাঙ্গ পেতে হবে।
সম্ভবত কোঁকড়া ধনুর্বন্ধনী এবং প্রথম বন্ধনী আন্তঃসত্তা ব্যবহার করা যেতে পারে যেখানে মনোনিবেশ করা ভাল: পদ্ধতি কলগুলিতে পরামিতিগুলি পাস করার সময়। আপনি কোঁকড়া ধনুর্বন্ধনী সঙ্গে বন্ধনী প্রতিস্থাপন করতে পারেন যদি এবং শুধুমাত্র যদি, পদ্ধতিটি একটি একক প্যারামিটার আশা করে। উদাহরণ স্বরূপ:
List(1, 2, 3).reduceLeft{_ + _} // valid, single Function2[Int,Int] parameter
List{1, 2, 3}.reduceLeft(_ + _) // invalid, A* vararg parameter
তবে এই নিয়মগুলি আরও ভালভাবে উপলব্ধি করার জন্য আপনাকে আরও জানতে হবে know
পেরেনগুলির সাথে সংকলন পরীক্ষা বৃদ্ধি করা
স্প্রেটির লেখকরা বৃত্তাকার প্যারেনগুলি সুপারিশ করেন কারণ তারা সংকলন পরীক্ষা বৃদ্ধি করেছেন। এটি স্প্রেয়ের মতো ডিএসএলদের জন্য বিশেষভাবে গুরুত্বপূর্ণ। পেরেন ব্যবহার করে আপনি সংকলককে বলছেন যে এটি কেবল একটি একক লাইন দেওয়া উচিত; অতএব আপনি যদি দুর্ঘটনাক্রমে দু'একটি বেশি দেন তবে এটি অভিযোগ করবে। এখন কোঁকড়া ধনুর্বন্ধনী সঙ্গে এটি হয় না - উদাহরণস্বরূপ আপনি যদি কোথাও কোনও অপারেটরকে ভুলে যান তবে আপনার কোডটি সংকলন করবে এবং আপনি অপ্রত্যাশিত ফলাফল এবং সন্ধানের জন্য খুব শক্ত একটি বাগ পেয়ে যাবেন। নীচে স্বীকৃতি দেওয়া হয়েছে (যেহেতু এক্সপ্রেশনগুলি খাঁটি এবং কমপক্ষে একটি সতর্কতা দেবে), তবে বিষয়টিটি উল্লেখ করে:
method {
1 +
2
3
}
method(
1 +
2
3
)
প্রথম সংকলন, দ্বিতীয়টি দেয় error: ')' expected but integer literal found
। লেখক লিখতে চেয়েছিলেন 1 + 2 + 3
।
ডিফল্ট আর্গুমেন্টগুলির সাথে একাধিক-পরামিতি পদ্ধতির জন্য এটি একইরকম তর্ক করতে পারে; পেরেন ব্যবহার করার সময় দুর্ঘটনাক্রমে প্যারামিটারগুলি পৃথক করার জন্য কমাটি ভুলে যাওয়া অসম্ভব।
শব্দব্যবহার
ভার্বোসিটি সম্পর্কে একটি গুরুত্বপূর্ণ প্রায়শই উপেক্ষা করা নোট। কোঁকড়া ধনুর্বন্ধনী ব্যবহার অনিবার্যভাবে ভার্বোজ কোডের দিকে পরিচালিত করে যেহেতু স্কালা শৈলী গাইড স্পষ্টভাবে বলেছে যে বক্রাকার বন্ধনীগুলি বন্ধ করতে হবে তাদের নিজস্ব লাইনে:
… ফাংশনটির শেষ লাইনটি অবিলম্বে অনুসরণ করা বন্ধনী বন্ধনী তার নিজস্ব লাইনে রয়েছে।
অনেকগুলি স্ব-সংস্কারক, যেমন ইন্টেলিজজে, আপনার জন্য স্বয়ংক্রিয়ভাবে এই পুনর্নির্মাণটি সম্পাদন করবে। আপনি যখন পারেন তখন বৃত্তাকার প্যারেনগুলি ব্যবহার করার জন্য আটকে থাকার চেষ্টা করুন।
ইনফিক্স নোটেশন
ইনফিক্স স্বরলিপি ব্যবহার করার সময়, যেমন List(1,2,3) indexOf (2)
একটি প্যারামিটার থাকে এবং আপনি যেমন লিখতে পারেন তবে প্যারেন্থিসিস বাদ দিতে পারেন List(1, 2, 3) indexOf 2
। এটি বিন্দু-চিহ্নিতকরণের ঘটনা নয়।
এটিও নোট করুন যে যখন আপনার একক প্যারামিটারটি মাল্টি-টোকেন এক্সপ্রেশন থাকে, যেমন x + 2
বা a => a % 2 == 0
, আপনাকে এক্সপ্রেশনটির সীমানা নির্দেশ করার জন্য প্রথম বন্ধনী ব্যবহার করতে হয়।
tuples
কারণ আপনি মাঝে মাঝে বন্ধনীর হাতছাড়া করতে পারেন, কখনও কখনও একটি টিউপলের মতো বাড়ির প্রথম বন্ধনী প্রয়োজন হয় ((1, 2))
এবং কখনও কখনও বাইরের প্রথম বন্ধনীও বাদ দেওয়া যেতে পারে, যেমন (1, 2)
। এটি বিভ্রান্তির কারণ হতে পারে।
ফাংশন / আংশিক ফাংশন সহ case
স্কালা ফাংশন এবং আংশিক ফাংশন আক্ষরিক জন্য একটি সিনট্যাক্স আছে। দেখে মনে হচ্ছে:
{
case pattern if guard => statements
case pattern => statements
}
কেবলমাত্র অন্য জায়গাগুলি যেখানে আপনি case
বিবৃতি ব্যবহার করতে পারেন তা match
এবং catch
কীওয়ার্ড সহ:
object match {
case pattern if guard => statements
case pattern => statements
}
try {
block
} catch {
case pattern if guard => statements
case pattern => statements
} finally {
block
}
আপনি case
অন্য কোনও প্রসঙ্গে বিবৃতি ব্যবহার করতে পারবেন না । সুতরাং, আপনি ব্যবহার করতে চান তাহলে case
, আপনি প্রয়োজন কোঁকড়া ধনুর্বন্ধনী। আপনি যদি ভাবছেন যে কোনও ফাংশন এবং আংশিক ফাংশনকে আক্ষরিক মধ্যে পার্থক্য কী করে, উত্তরটি হল: প্রসঙ্গ। যদি স্কালা কোনও ফাংশন প্রত্যাশা করে তবে একটি ফাংশন আপনি পাবেন। যদি এটি একটি আংশিক ফাংশন আশা করে, আপনি একটি আংশিক ফাংশন পাবেন। যদি উভয়ই প্রত্যাশিত হয় তবে এটি অস্পষ্টতা সম্পর্কে ত্রুটি দেয়।
এক্সপ্রেশন এবং ব্লক
পেরফেলেসিসকে subexpressions করতে ব্যবহার করা যেতে পারে। কোঁকড়া ধনুর্বন্ধনী কোডের ব্লক করতে ব্যবহার করা যেতে পারে (এই হল না একটি ফাংশন আক্ষরিক তাই এক মত ব্যবহার করার চেষ্টা হুঁশিয়ার)। কোডের একটি ব্লকে একাধিক বিবৃতি থাকে, যার মধ্যে প্রতিটি আমদানি বিবৃতি, একটি ঘোষণা বা একটি এক্সপ্রেশন হতে পারে। এটা এইভাবেই চলে:
{
import stuff._
statement ; // ; optional at the end of the line
statement ; statement // not optional here
var x = 0 // declaration
while (x < 10) { x += 1 } // stuff
(x % 5) + 1 // expression
}
( expression )
সুতরাং, আপনার যদি ঘোষণাপত্র, একাধিক বিবৃতি, এর import
মতো বা অন্য কিছু দরকার হয় তবে আপনার কোঁকড়া ধনুর্বন্ধনী প্রয়োজন। এবং যেহেতু একটি অভিব্যক্তি একটি বিবৃতি, কোঁকড়া ধনুর্বন্ধনী এর ভিতরে প্রথম বন্ধনী প্রদর্শিত হতে পারে। তবে মজার বিষয় হ'ল কোডের ব্লকগুলিও হ'ল এক্সপ্রেশন, যাতে আপনি এটিকে একটি অভিব্যক্তির ভিতরে যে কোনও জায়গায় ব্যবহার করতে পারেন :
( { var x = 0; while (x < 10) { x += 1}; x } % 5) + 1
সুতরাং, যেহেতু এক্সপ্রেশনগুলি হ'ল বিবৃতি, এবং কোডগুলির ব্লকগুলি হল এক্সপ্রেশন, নীচের সমস্ত কিছুই বৈধ:
1 // literal
(1) // expression
{1} // block of code
({1}) // expression with a block of code
{(1)} // block of code with an expression
({(1)}) // you get the drift...
যেখানে এগুলি বিনিময়যোগ্য নয়
মূলত, আপনি অন্য কোথাও এর {}
সাথে ()
বিপরীতে বা বিপরীত করতে পারবেন না । উদাহরণ স্বরূপ:
while (x < 10) { x += 1 }
এটি কোনও মেথড কল নয়, সুতরাং আপনি এটিকে অন্য কোনও উপায়ে লিখতে পারবেন না। ঠিক আছে, আপনি জন্য বন্ধনী ভিতরে কোঁকড়া ধনুর্বন্ধনী লাগাতে পারেন condition
, পাশাপাশি কোড ব্লক করার জন্য কোঁকড়া ধনুর্বন্ধনী এর ভিতরে বন্ধনী ব্যবহার করতে পারেন :
while ({x < 10}) { (x += 1) }
সুতরাং, আমি আশা করি এটি সাহায্য করবে।