سمات سكالا وارتباك التحويل الضمني
-
27-09-2019 - |
سؤال
تعمل الأسطر التالية عندما أدخلها باليد على Scala REPL (2.7.7):
trait myTrait {
override def toString = "something"
}
implicit def myTraitToString(input: myTrait): String = input.toString
object myObject extends myTrait
val s: String = myObject
ومع ذلك ، إذا حاولت تجميع الملف معه ، أحصل على الخطأ التالي:
[error] myTrait.scala:37: expected start of definition
[error] implicit def myTraitToString(input: myTrait): String = input.toString
[error] ^
لماذا ا؟
شكرًا!
المحلول
لا يمكن تعريف الوظائف في المستوى الأعلى. وضع myTraitToString
في كائن (رفيق ، إذا أردت):
object myTrait {
implicit def myTraitToString(input : myTrait) : String = input.ToString
}
ثم إحضاره في النطاق:
import myTrait._
عندما يكون MyTraitToString في نطاق - أي عندما يمكنك الاتصال به بدون أي نقاط - سيتم تطبيقه ضمنيًا.
لا تنتمي إلى StackOverflow