ทำให้เข้าถึงโดยนัยจากอ็อบเจ็กต์อื่นได้เมื่อนำเข้าอ็อบเจ็กต์ของฉัน

เมื่อมีคนนำเข้าอ็อบเจ็กต์ของฉัน ฉันต้องการให้คลาสโดยนัยจากอ็อบเจ็กต์ (หรือแพ็คเกจ) อื่น ๆ พร้อมใช้งานสำหรับพวกเขา การมี import ในอ็อบเจ็กต์ไม่ได้ช่วยอะไร เนื่องจากการนำเข้าจะไม่ถูกนำเข้าแบบส่งผ่าน ดังนั้นฉันคิดว่าฉันต้องใช้ implicit def หรือ val บางส่วน อย่างไรก็ตาม ฉันไม่สามารถหาวิธีที่เหมาะสมในการบรรลุเป้าหมายนี้ได้ มีเพียง def ที่ค่อนข้างละเอียดเท่านั้น:

object Main extends App {

  object A {

    implicit class ExtendedMath(val x: Double) extends AnyVal {
      def square = x * x
    }

  }

  object X {

    import A._

    // what to write here, so that ExtendedMath is forwarded to our users?
    // following works, but it seems quite verbose
    implicit def extendedMath(x: Double): ExtendedMath = ExtendedMath(x)
  }


  import X._
  val a = 0.0
  println(a.square)
}

มีวิธีที่กระชับกว่านี้ไหม?


person Suma    schedule 06.01.2016    source แหล่งที่มา
comment
คุณสามารถควบคุมแพ็คเกจที่คุณต้องการดึงข้อมูลโดยนัยได้หรือไม่?   -  person Michael Zajac    schedule 07.01.2016
comment
@ m-z ในกรณีนี้ฉันทำได้ แต่ฉันจินตนาการได้ว่าบางครั้งมีคนต้องการส่งต่อโดยนัยจากแพ็คเกจบุคคลที่สาม   -  person Suma    schedule 07.01.2016
comment
ใส่นัยเข้าไปในลักษณะที่ขยายโดยวัตถุทั้งสอง   -  person stew    schedule 07.01.2016


คำตอบ (1)


ตามที่ @stew แนะนำ วิธีการทั่วไปคือการกำหนดนัยในลักษณะที่คุณสามารถผสมหลายๆ ครั้งได้ ข้อแม้เดียวคือคลาสของค่าไม่ได้รับอนุญาตให้อยู่ภายในคุณลักษณะ ดังนั้นคุณต้องหันไปใช้การแยกคลาสของค่าและการแปลงโดยนัย:

class ExtendedMath(val x: Double) extends AnyVal {
  def square = x * x
}

trait HasMath {
  // note: method name somehow must not shadow
  // value class name, therefore we use lower-case
  implicit def extendedMath(x: Double): ExtendedMath = new ExtendedMath(x)
}

object A extends HasMath

object X extends HasMath

object Test {
  import X._
  4.0.square
}
person 0__    schedule 07.01.2016
comment
ดังนั้นคุณต้องหันไปใช้การแยกคลาสค่าและการแปลงโดยนัย: - เนื่องจากภาระนี้ไม่ได้อยู่ที่ผู้ใช้ของออบเจ็กต์ ฉันจึงพบว่ามันยอมรับได้ หากนี่เป็นแนวทางทั่วไป จะมีชื่ออะไรบ้าง? - person Suma; 07.01.2016
comment
@Suma ฉันไม่ทราบชื่อเฉพาะใด ๆ ที่กำหนดให้กับแนวทางนี้ แต่ฉันเคยเห็นมันหลายครั้งจึงเป็นเรื่องปกติ - person 0__; 07.01.2016