স্কালায় একাধিক নিখুঁত যুক্তি সহ একটি ফাংশন সংজ্ঞায়িত করা


95

আমি একাধিক নিখুঁত যুক্তি সহ কোনও ফাংশনকে কীভাবে সংজ্ঞায়িত করতে পারি।

def myfun(arg:String)(implicit p1: String)(implicit p2:Int)={} // doesn't work

4
প্রশ্ন পাঠ্যে আপনি একটি ফাংশন সম্পর্কে জিজ্ঞাসা করছেন। আপনার কোড স্নিপেটে, আপনার একটি পদ্ধতি রয়েছে। আপনি কোন ফাংশন বা কোনও পদ্ধতি সম্পর্কে জিজ্ঞাসা করছেন?
জার্গ ডব্লু মিট্টাগ

উত্তর:


190

তাদের সকলকে অবশ্যই একটি প্যারামিটার তালিকায় যেতে হবে এবং এই তালিকাটি অবশ্যই সর্বশেষ হওয়া উচিত।

def myfun(arg:String)(implicit p1: String, p2:Int)={} 

4
এটি যদি শ্রেণি হত তবে সিনট্যাক্সটি MyClass () অন্তর্ভুক্ত ছিল (অন্তর্নিহিত পি 1: স্ট্রিং, অন্তর্নিহিত পি 2: ইনট) {}
স্কাজাগিনী

2

ওপিতে যা প্রয়োজন ঠিক তা করার একটি উপায় আছে। একটু কনভোল্টেড তবে এটি কাজ করে।

class MyFunPart2(arg: String, /*Not implicit!*/ p1: String) {
  def apply(implicit p2: Int) = {
    println(arg+p1+p2)
    /* otherwise your actual code */
  }
}

def myFun(arg: String)(implicit p1: String): MyFunPart2= {
  new MyFunPart2(arg, p1)
}

implicit val iString= " world! "
implicit val iInt= 2019

myFun("Hello").apply
myFun("Hello")(" my friend! ").apply
myFun("Hello")(" my friend! ")(2020)

//  Output is:
//      Hello world! 2019
//      Hello my friend! 2019
//      Hello my friend! 2020

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


1

অনুরূপ প্রভাব অর্জনের জন্য আরও একটি (আইএমও সহজ এবং আরও নমনীয়) উপায় রয়েছে:

// Note the implicit is now a Tuple2
def myFun(arg: String)(implicit p: (String, Int) ): Unit = {
  println(arg + p._1 + p._2)
  /*otherwise your actual code*/
}

// These implicit conversion are able to produce the basic implicit (String,Int) Tuples
implicit def idis(implicit is: String, ii: Int): (String,Int)= (is,ii)
implicit def idi(s: String)(implicit ii: Int): (String,Int)= (s,ii)

// The basic implicit values for both underlying parameters
implicit val iString = " world! "
implicit val iInt = 2019

myFun("Hello")
myFun("Hello")(" my friend! ")
myFun("Hello")(" my friend! ",2020)

// Output is:
//     Hello world! 2019
//     Hello my friend! 2019
//     Hello my friend! 2020

// If we add the following implicit, 
implicit def ids(i: Int)(implicit is: String)= (is,i)

// we can even do
myFun("Hello")(2020)

// , and output is:
//     Hello world! 2020

প্যারামিটারগুলির অন্তর্নিহিত উপস্থাপনা হিসাবে একটি টুপল ব্যবহার করা ভাল ধারণা নয় কারণ অন্তর্নিহিত রূপান্তরগুলি অন্যান্য ব্যবহারের সাথে হস্তক্ষেপ করতে পারে। প্রকৃতপক্ষে, কোনও মানক প্রকারের (অন্তর্ভুক্ত গ্রন্থাগার সহ) অন্তর্নিহিত রূপান্তরগুলি সাধারণত কোনও তুচ্ছ তুচ্ছ প্রয়োগে সমস্যা তৈরি করে। সমাধানটি হল টিউপলের পরিবর্তে পরামিতিগুলি ধরে রাখতে একটি ডেডিকেটেড কেস ক্লাস তৈরি করা। একটি গুরুত্বপূর্ণ সুবিধা হ'ল এগুলিকে _1 এবং _2 এর চেয়ে অনেক বেশি অর্থবহ নাম দেওয়া যেতে পারে।

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