المعلمات الضمنية والتحويلات في Scala

بعد أن تجاوزت المقالات السابقة عن هبر ، لم يستطع tyts و tyts أن يفهموا بسرعة ما يفعله ضمنيًا في Scala. دعونا نحاول معرفة ذلك معا.


لذلك ، يسمح لك الضمني في Scala بتجنب طرق الاتصال أو الإشارات الصريحة إلى المتغيرات ، وبدلاً من ذلك ، يسمح للمترجم بالعثور على البيانات الضمنية اللازمة نفسها.

على سبيل المثال ، يمكننا كتابة دالة للتحويل من Float إلى Int (FloatToInt) ، وبدلاً من استدعاء هذه الوظيفة بشكل صريح ، فإن المترجم سيقوم بذلك ضمنيًا بالنسبة لنا:

def double(value: Int) = value * 2 implicit def FloatToInt(value: Float):Int = value.toInt println(double(2.5F)) 

الخلط؟ دعونا الحصول على كل شيء في النظام.

لذلك ، اليوم ننظر إلى فئتين ضمنيتين ، وهما:

  • المعلمات الضمنية (القيم). يتم تمريرها تلقائيًا بواسطة قيم برنامج التحويل البرمجي المعلنة عبر الضمني.
  • تحويل ضمني إذا كان نوع المعلمة المتوقعة لا يتطابق مع معلمة الإدخال ، يبحث المحول البرمجي عن أي طريقة في النطاق الذي تم وضع علامة ضمنية ومع المعلمة المتوقعة ومعلمة الإدخال اللازمة في هذا الموقف وتمريرها تلقائيًا.

المعلمة الضمنية


المعلمة الضمنية هي معلمة دالة مسبوقة بكلمة أساسية ضمنية. يعني ذلك أنه إذا لم يتم تمرير قيمة عند استدعاء الوظيفة ، فسوف يبحث المترجم شخصيًا عن المعلمة الضمنية ويمررها لنا.

على سبيل المثال ، هذه الوظيفة التي تأخذ قيمة معلمة ضمنية كمدخلات وتضاعفها:

 def double(implicit value: Int) = value * 2 

بدون معلمة ضمنية ، ستفشل مع وجود خطأ:

 def double(implicit value: Int) = value * 2 println(double) // error: could not find implicit value for parameter value 

بعد تمرير معلمة صريحة ، ستعمل:

 def double(implicit value: Int) = value * 2 println(double(3)) // 6 

باستخدام معلمة ضمنية ، سيبدو كما يلي:

 def double(implicit value: Int) = value * 2 implicit val multiplier = 2 println(double) // 4 

ولكن عليك أن تكون حذرا:

 def double(implicit value: Int) = value * 2 implicit val multiplier = 2 implicit val multiplier2 = 1 println(double) // error: ambiguous implicit values 

وأخيرًا ، مثال على تمرير def كمعلمة ضمنية:

 def double(implicit value: Int) = value * 2 val cappucinoLarge: Boolean = false implicit def cappucinoPrice: Int = if (cappucinoLarge) 200 else 100 println(double) // 200 

أي في النهاية سننجح
 double(cappucinoPrice()) 

ملاحظات بناء الجملة:

 def func1(implicit value1: Int) // value1  def func2(implicit value1: Int, value2: Int) // value1  value2  def func3(value1: Int, implicit value2: Int) //   def func4(value1: Int)(implicit value2: Int) //  value2  def func5(implicit value1: Int)(value2: Int) //   def func6(implicit value1: Int)(implicit value2: Int) //   

تحويل ضمني


العودة إلى المثال من Float إلى Int:

 def double(value: Int) = value * 2 implicit def FloatToInt(value: Float):Int = value.toInt println(double(2.5F)) 

عند استدعاء double ، لدينا عدم تطابق نوع المعلمة المتوقعة (Int) مع معلمة الإدخال (Float). لذلك ، يبحث المحول البرمجي عن أي طريقة في النطاق ، تم وضع علامة ضمنية عليها مع المعلمة المتوقعة (Int) ومعلمة الإدخال (Float) اللازمة في هذا الموقف. يبحث عن FloatToInt ، ويقوم بالتحويل ، ويمرر القيمة المطلوبة إلى الضعف.

الآن ، آمل ، أصبح الأمر أكثر وضوحًا. كل النجاح في إتقان سكالا!

Source: https://habr.com/ru/post/ar451358/


All Articles