1

「delegatedFoo()」と呼ばれる関数デリゲート メソッドがあり、次のようにメソッド (つまり、関数ポインターの scala バージョン) に引数として渡す必要があるとします。

addMyDelegatedMethod(delegatedFoo)

(簡潔にするために)その行は問題なくコンパイル/実行されると仮定します。これを次のように変更します。

addMyDelegateOverrideMethod("uh-o", delegatedFoo)

この行はコンパイラ例外をスローします:クラス myClass のメソッド delegatedFoo の引数がありません

Q: 複数引数のメソッド呼び出し内でデリゲート (参照) を渡すにはどうすればよいですか? (これはScalaでもできることですか?)

編集: より正確に言うと、署名は次のようになります。

def delegatedFoo(str: String): String = { return "OK" }
def addMyDelegatedMethod(delegate: (String) => (String))
def addMyDelegateOverrideMethod(foo: String, delegate: (String) => (String))

更新: パオロの回答を確認し、さらに実験を行った後、オーバーロードされた署名が関係している場合に、問題 (バグ?) が表面化するのを確認できます。(使用されていないため、上記の例にそれを投げ込むことはしませんでしたが、そこにあるだけコンパイラに頭痛がするようです):

scala> object MyControl {
   def doDele(strA: String, strB: String, delegate: String => String) { delegate(strA) }
   def doDele(strA: String, count: Int, delegate: String => String) { delegate(strA) }
}
defined module MyControl

scala> def myFn(s: String): String = { println(s); s }
myFn: (s: String)String

scala> MyControl.doDele("hello", "bye", myFn)
<console>:10: error: missing arguments for method myFn;
follow this method with `_' if you want to treat it as a partially applied function
          MyControl.doDele("hello", "bye", myFn)

MyControl にはオーバーロードされたメソッドのセットが定義されています...オーバーロード メソッドをコメント アウトする (またはその名前を変更する) と、コンパイラはそれを適切に処理します... :\

4

1 に答える 1

1

アップデート:

myFnエラーが示すように、を明示的にフォローする必要があります_

scala> MyControl.doDele("hello", "bye", myFn _)
hello

その理由は、scala ではメソッド (定義してクラスまたはオブジェクトに存在するもの) は関数ではないためです (実際には、独自defのメソッドを持つオブジェクトに似ています)。apply場合によっては、関数が必要なメソッドを渡すことができ、scala が一方を他方に「変換」します。_ただし、一般に、関数のように扱うように scala に指示するには、 with のメソッドに従う必要があります。

たとえば、定義後の REPL でこれに注意してください。

scala> myFn
<console>:9: error: missing arguments for method myFn;
follow this method with `_' if you want to treat it as a partially applied funct
ion
              myFn
              ^

scala> myFn _
res4: String => String = <function1>

__

やろうとしていること/失敗したことのより完全な例を提供する必要があるかもしれませんが、これはscalaでうまく機能します:

scala> def delegatedFoo(str: String): String = "OK"
delegatedFoo: (str: String)String

scala> def addMyDelegatedMethod(delegate: String => String) = delegate("meh")
addMyDelegatedMethod: (delegate: String => String)String

scala> def addMyDelegateOverrideMethod(foo: String, delegate: String => String)
= delegate(foo)
addMyDelegateOverrideMethod: (foo: String, delegate: String => String)String

scala> addMyDelegatedMethod(delegatedFoo)
res0: String = OK

scala> addMyDelegateOverrideMethod("hey",delegatedFoo)
res4: String = OK
于 2013-09-24T16:45:05.513 に答える