2017-07-06 12 views
1

私は、Applicationという特性を拡張するクラスに静的ユーティリティを付けたいと思っています。scala:暗黙クラス内に定義されたインポート関数

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 = getString("hello") 
+1

アプリからすべてインポートできます。 import app._ – Ivan

+0

申し訳ありませんが、コメントは応答のために暗黙の – Ivan

答えて

0

を呼び出す

val test = app.getString("hello") 

をひそかありませんapp:アプリケーションをappWithConfに変換するIG:のAppConfigとappWithConfigのすべてのメソッドをインポート:私が持っていた最良の選択肢は、親オブジェクトのメソッドを参照するようにしたのAppConfig

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

には関係ありません。私がこの記事で触れたように、暗黙的なクラスを使って静的ユーティリティをアタッチすることで、アプリケーションの特性を拡張したいと考えています。これは、私の特定の要件に関連する解決策ではありません。 – sgireddy

+0

以下も同様ですが、コンパイラはthisキーワードを省略させません。 TestAppConfがアプリケーション{ \tオーバーライドヴァル名= "TestAppConf" \tヴァルテスト= this.getString( "こんにちは") \tのprintln(S "構成値が$テストである") でアプリケーションを拡張 \t \tオブジェクト\t} – sgireddy

0

を:

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") 

} 
関連する問題