1

私のDSLでは、この機能が必要です。

class Test {

  val compA = dependant(true, true)(Component("parameters"))

  //and this shortcut:

  val compB = dependant Component("parameters")
}

どこ:

def dependant(onEnable: Boolean, onDisable: Boolean)(c: Component): Component = {
   //...
}

def dependant(c: Component): Component = dependant(false, true)(c)

すべて問題ありませんが、次の構文は使用できません。

val compB = dependant Component("parameters")

それが言うので

オーバーロードされた定義へのあいまいな参照、タイプ(onEnable:Boolean、onDisable:Boolean)(c:Component)ComponentのクラスTestに依存するメソッドとタイプ(c:Component)ComponentのクラスTestに依存するメソッドの両方が期待されるタイプに一致しますか?

ただし、パラメータを括弧で囲むと、次のようになります。

val compB = dependant(Component("parameters"))

エラーはなくなりました。明らかに、コンパイラーは括弧のない場合の脱糖に失敗します。これは予想されることですか、それとも私は何か間違ったことをしていますか?これが予想される場合、なぜですか?dependantメソッドをプレフィックスとして使用する機能を括弧なしで再利用するにはどうすればよいですか?

4

2 に答える 2

2

オブジェクトを提供すると、期待どおりに機能するmyObject functionName param代わりに書き込みを行うことができます。myObject.functionName(param)そうしないと、コンパイラが失われます。例えば:

scala> println("Hello")
Hello

scala> println "Hello"
<console>:1: error: ';' expected but string literal found.
       println "Hello"
           ^

考えられる回避策:メソッドをラップするオブジェクトを作成します。

scala> case class Component(name: String, components: Option[Component] = None)
defined class Component

scala> object depends {def on(c: Component) = Component("dependant", Some(c))}
defined module depends

scala> depends on Component("foo")
res3: Component = Component(dependant,Some(Component(foo,None)))
于 2012-09-11T09:17:09.530 に答える
2

を呼び出すためにdependant Component("parameters")プレフィックス表記を使用しようとしていますdependant。プレフィックス表記に対する Scala のサポートは制限されています。

Scala - 前置単項演算子を参照してください。

別の方法として、後置記法を使用することもできます (のようにComponent("parameters") dependant)。Componenet の実装を変更できる場合、これは単にdependantメソッドを に追加することを意味しますComponent

class Component(name: String) {
  def dependant: Component = //...
  def dependant(onEnable: Boolean, onDisable: Boolean): Component = {
    //...
  }    
}

class Test {
  val compA = Component("parameters") dependant(true, true)
  val compB = Component("parameters") dependant
}

を変更できない場合はComponent、「pimp my library idiom」を使用できます。このイディオムの簡単な紹介については、 http://www.decodified.com/scala/2010/12/02/the-quickpimp-pattern.htmlを参照してください(以下の匿名クラスの使用に関する警告とともに)。

case class Component(name: String)

implicit def toPostifxDependentOps( c: Component ) = new {
  def dependant: Component = dependant(false, true)
  def dependant(onEnable: Boolean, onDisable: Boolean): Component = {
    //...
  }
}

class Test {
  val compA = Component("parameters") dependant(true, true)
  val compB = Component("parameters") dependant
}
于 2012-09-11T09:47:51.970 に答える