3

Scala では、ライブラリ関数/値 (私が作成している DSL 用) と暗黙の両方を提供する大きな「環境」クラスを持つ必要がないように、暗黙的な変換のインポートをスコープに委任するにはどうすればよいですか?変換?

要するに、オブジェクトから暗黙的な変換を移動し、次のように記述したときにそれをインポートすることはできますか?

MyDslEnvironment をインポートします。_

?

これの目標は、フレームワークのインポートと使用をシンプルかつ軽量にすることです。つまり、1 つのインポート ステートメントだけで、DSL/フレームワークに必要な機能がユーザーに提供されるという意味です。

PS: 誰かが私を非難する前に - はい、私は暗黙の変換から生じる可能性のある落とし穴と不快感を認識しています。

4

2 に答える 2

3

これは、特性を使用して簡単に実現できます。(モジュール性を実現するために) 必要な数のトレイトで暗黙的な変換を定義し、それらのトレイトを 1 つのオブジェクト (MyDslEnvironment) に混在させるだけです。例:

case class Foo( value: Int )
case class Bar( value: String )
object Baz {
  def test( foo: Foo, bar: Bar ) { println( foo + "," + bar ) }
}

trait ImplicitEnv1 {
  implicit def toFoo( value: Int ) = Foo( value )
}

trait ImplicitEnv2 {
  implicit def toBar( value: String ) = Bar( value )
}

object MyDslEnvironment extends ImplicitEnv1 with ImplicitEnv2

その後、次のことができます。

scala> import MyDslEnvironment._
import MyDslEnvironment._
scala> Baz.test( 123, "hello" )
Foo(123),Bar(hello)

実際には、暗黙的な変換だけでなく、すべてのコード (上記の例ではFooBarおよびBaz上記の例) をトレイト内に配置できます (これには自己型注釈の使用が必要になる場合があります)。この時点で、(悪名高い) 有名なケーキ パターンのバリエーションの 1 つを基本的に実装したことになります。http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/を参照してください。

于 2012-10-15T20:55:03.130 に答える
3

私の傾向は、パッケージ オブジェクトに暗黙を配置することです。

作業がパッケージ com.acme.mydsl で定義されるとします。ソース ファイルは、ディレクトリ階層 com > acme > mydsl に配置されます。ディレクトリ mydsl で、次のようにオブジェクトを定義します。

package com.acme; //we are in the mydsl dir, but note no mydsl in
                  //in the package declaration

package object mydsl {

   implicit def idioticallyStringsAre5( s : String ) : Int = 5

   //define other utilities that should be available within
   //the package or importable

}

これで、次のことができます。

scala> import com.acme.mydsl._
import com.acme.mydsl._

scala> def sum( a : Int, b : Int ) = a + b
sum: (a: Int, b: Int)Int

scala> sum("hello", "there")
res0: Int = 10

import com.acme.mydsl._ をインポートすることにより、暗黙的な変換を含むすべてのパッケージ レベルの関数定義を取得しました。

パッケージオブジェクトがとても好きです。ユーティリティ関数のためだけにクラスを静的メンバーでいっぱいにしなければならないのは、Java では常にばかげているように思えました。パッケージ オブジェクトは、暗黙的な変換を含め、これらのユーティリティの非常に洗練された名前空間として機能します。

于 2012-10-16T17:03:00.093 に答える