كيف يمكنني تحويل ضمنيا التيوبل لناقلات في سكالا
سؤال
وأريد أن أكون قادرة على تحويل ضمنيا التيوبل من الأرقام ([إينتس] ومزدوجة) إلى كائن متجه.
وعلى افتراض فئة ناقلات مع طريقة +
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
خارجا تماما، على الرغم من أن هذا يعني أن جميع الأعداد الصحيحة أن يكون أول تحويلها ضمنيا إلى الزوجي.