كيف يمكنني تحويل ضمنيا التيوبل لناقلات في سكالا

StackOverflow https://stackoverflow.com/questions/707162

  •  22-08-2019
  •  | 
  •  

سؤال

وأريد أن أكون قادرة على تحويل ضمنيا التيوبل من الأرقام ([إينتس] ومزدوجة) إلى كائن متجه.

وعلى افتراض فئة ناقلات مع طريقة +

case class Vector(x: Double, y:Double){
  def + (v:Vector)= new Vector(x+v.x,y+v.y)
} 

وهدفي هو أن يكون العمل البرمجية التالية.

val vec = (1,2)+(.5,.3) // vec == Vector(1.5,2.3)

ويمكن أن أحصل عليه للعمل من أجل Int بما يلي

implicit def int2vec(t:Tuple2[Int,Int])=new Vector(t._1,t._2)
val vec = (1,2)+(3,4) // vec == Vector(4.0,6.0)

ولكن فشلت عندما إضافة التحويل لمضاعفة

implicit def int2vec(t:Tuple2[Int,Int])=new Vector(t._1,t._2)
implicit def double2vec(t:Tuple2[Double,Double])=new Vector(t._1,t._2)
val a = (1,2)
val b = (.5,.3)
val c = (1,1)+b // vec = Vector(1.5,1.3)
val d = (1,2)+(.3,.5) // compile error: wrong number of arguments
val e = (1,2)+((.3,.5)) // compile error: type mismatch

وتحاول مضاعفة في sugestion اندري لمجرد

implicit def double2vec(t:Tuple2[Double,Double])=new Vector(t._1,t._2)
val a = (.5,.3)
val b = (1,1)+a // type mismatch found:(Double,Double) required:String 

وماذا يجب أن أفعل للحصول على هذا العمل؟

هل كانت مفيدة؟

المحلول

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

وعلى وجه الخصوص، أقترح عليك أن تجعل التعريف التالي:

val V = Vector

وبعد ذلك تعمل كل الأمثلة الخاصة بك كما كنت تتوقع، من دون أي implicits، والسحر، أو رسائل خطأ مشفرة، وعلى حساب من حرف واحد فقط لكل ناقل.

val a = V(1,2)+V(.5,.3)
val b = V(1,2)+V(3,4)
val c = V(1,2)
val d = V(.5,.3)
val e = V(1,1)+b
val f = V(1,2)+V(.3,.5)
val g = V(.5,.3)
val h = V(1,1)+a

وانها ليست بالضبط بناء الجملة التي تريد، ولكن ثق بي، وأنها سوف توفر لك الألم والصداع في المدى الطويل.

نصائح أخرى

وهذه تحويلات ضمنية غامضة وبالتالي سوف سكالا عدم استخدام أي منهما. هذا هو السبب في ان السطور الأخيرة يتم تقييم.

واحد طريقة لإصلاح هذا من شأنه أن يترك int2vec خارجا تماما، على الرغم من أن هذا يعني أن جميع الأعداد الصحيحة أن يكون أول تحويلها ضمنيا إلى الزوجي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top