স্কেলা ইনফিক্স স্বরলিপি


12

ইনফিক্স নোটেশন ব্যবহার করে কোনও পদ্ধতি কল করা কি সম্ভব?

উদাহরণস্বরূপ, হাসকেলে আমি নিম্নলিখিত ফাংশনটি লিখতে পারি:

x `isAFactorOf` y = x % y == 0

এবং তারপরে এটি ব্যবহার করুন:

if 2 `isAFactorOf` 10 ...

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

উত্তর:


15

সংস্করণ ২.১০ দিয়ে শুরু করে, স্কালা এই সমস্যাটি সুনির্দিষ্টভাবে পরিচালনা করার জন্য অন্তর্নিহিত শ্রেণি চালু করেছিল।

এটি একটি প্রদত্ত শ্রেণিতে প্রদত্ত ধরণের উপর একটি অন্তর্নিহিত রূপান্তর সম্পাদন করবে, এতে আপনার নিজস্ব পদ্ধতি এবং মান থাকতে পারে।

আপনার নির্দিষ্ট ক্ষেত্রে, আপনি এই জাতীয় কিছু ব্যবহার করতে চাই:

implicit class RichInt(x: Int) {
  def isAFactorOf(y: Int) = x % y == 0
}

2.isAFactorOf(10)
// or, without dot-syntax
2 isAFactorOf 10

নোট করুন যে সংকলিত হওয়ার পরে এটি আমাদের কাঁচা মানটিকে একটি হিসাবে শেষ করবে RichInt(2)। আপনি আপনার রিচআইন্টের একটি সাবক্লাস হিসাবে ঘোষণা করে এটি ঘিরে ফেলতে পারেন AnyVal:

implicit class RichInt(val x: Int) extends AnyVal { ... }

এটি বক্সিং করতে পারে না, তবে এটি একটি সাধারণ অন্তর্নিহিত শ্রেণীর চেয়ে বেশি সীমাবদ্ধ। এটা করতে পারেন শুধুমাত্র পদ্ধতি, না মান বা রাষ্ট্র ধারণ করে।


2
আপনার সম্ভবত উল্লেখ করা উচিত যে অন্তর্নিহিত শ্রেণিগুলি শীর্ষ-স্তরের হতে পারে না, সুতরাং অন্তর্নিহিত শ্রেণিটি স্থানীয়ভাবে সংজ্ঞায়িত করা দরকার।
কারসিজেনিকেট

3

মূলত, স্কালায় আপনি ইনফিক্স পদ্ধতিতে কোনও ফাংশন কল করতে পারবেন না, তবে আপনি কোনও ধরণের কোনও পদ্ধতি নির্ধারণ করতে পারেন, যা বাম আর্গুমেন্টকে স্পষ্টত রূপান্তরিত করা যেতে পারে। সুতরাং আপনার উদাহরণস্বরূপ, আপনি একটি ক্লাস সংজ্ঞায়িত করতে পারেন যার একটি পদ্ধতি রয়েছে এএফ্যাক্টরঅফ (একটি আন্ত গ্রহণ করা) এবং ইঙ্গিত করে যে কোনও ইন্টার স্পষ্টভাবে এই শ্রেণীর উদাহরণে রূপান্তরিত হতে পারে।

আপনি যদি অন্য প্রশ্নের এই https://stackoverflow.com/a/3119671 উত্তরটি লক্ষ্য করেন তবে আপনি স্কালায় বাক্য গঠনটি দেখতে পাবেন যা সমানভাবে কাজ করে।


এটি উল্লেখ করার মতো যে স্কেলার নতুন সংস্করণগুলির জন্য এটির জন্য স্পষ্টভাবে একটি নির্মাণ রয়েছে, যা যুক্ত লিঙ্কযুক্ত উত্তরটি সম্বোধন করে না: implicit class RichInt(i: Int) { def square() = i * i }
কেচালাক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.