سؤال

تعمل الأسطر التالية عندما أدخلها باليد على 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 في نطاق - أي عندما يمكنك الاتصال به بدون أي نقاط - سيتم تطبيقه ضمنيًا.

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