簡體   English   中英

Scala:在隱式類中定義的導入函數

[英]scala: import functions defined inside implicit class

我想將靜態實用程序附加到那些擴展了稱為Application的特征的類上。

trait Application {
    def name: String
}

case class TestApp(name: String) extends Application


object ImplicitConf {
  implicit class AppConfig[T <: Application](val app: T) {

    lazy val conf = loadConfig

    def loadConfig = {
      ConfigFactory.load(app.name)
    }

    def getString(path: String): String = conf.getString(path)
  }
}

現在,以下工作正常:

import Application, TestApp
import ImplicitConf._
import AppUtil._

object TestAppConf extends App {

  val app: Application = TestApp("TestAppConf")
  val test = app.getString("hello")
  println(s"The Config value is $test")

}

但是我太貪心了,我怎么隱瞞電話

val test = app.getString("hello")

進入

val test = getString("hello")

您可以將app:Application顯式轉換為appWithConfig:AppConfig並導入appWithConfig:AppConfig的所有方法

   val appWithConfig = new AppConfig(app)
   import appWithConfig._

我最好的選擇是引用父對象中的方法:

object ImplicitConf {

  def getString[T <: Application](str: String)(implicit app: T) = AppConfig(app).getString(str)

  implicit class AppConfig[T <: Application](val app: T) {

    @transient lazy val conf = loadConfig


    def loadConfig = {
      ConfigFactory.load(app.name)
    }

    def getString(path: String): String = conf.getString(path)

  }
}

然后,我可以如下調用:

object TestAppConf extends App {

  implicit val app: Application = TestApp("TestAppConf")

  val test = getString("hello")

  println(s"The Config value is $test")

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM