2013-09-24 3 views
1

Предположим, что существует функциональный метод делегирования, называемый делегированнымFoo(), который должен передаваться как аргумент метода (то есть версия scala-функции указателя функции):Вызов делегата Scala в вызове метода с несколькими аргументами

addMyDelegatedMethod(delegatedFoo) 

Предположим (для краткости), что линия компилируется/выполняется просто отлично. Теперь измените его следующим образом:

addMyDelegateOverrideMethod("uh-o", delegatedFoo) 

Эта линия будет бросать исключение компилятора: недостающие аргументы для метода delegatedFoo в классе MyClass

Q: Как можно идти о передаче делегата (ссылка) в пределах вызов с несколькими аргументами? (Это то, что даже может быть сделано в Scala?)

EDIT: быть более точными, то подпись будет выглядеть следующим образом:

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

UPDATE: после рассмотрения ответа Паоло и делают некоторые более экспериментируя, насколько это возможно, я могу рассказать о проблемах (ошибках?), когда есть перегруженная подпись. (Я не стал бросать, что в моем примере выше, так как она не была использована - но только имея он появляется, чтобы дать мой компилятор головной боли):

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 имеет набор перегружен методы определены ... закомментировать метод перегрузки (или изменить его имя), и компилятор будет обрабатывать его в порядке ...: \

ответ

1

UPDATE:

Как ошибка говорит, что вы должны явно следовать myFn с a _

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

Причиной этого является то, что в Скале метод (что можно определить с def и жизни в классе или объекта) не является функцией (которая на самом деле больше похож на объект с apply методом его собственной). В некоторых случаях вы можете передать метод, в котором требуется функция, и scala будет «преобразовывать» один в другой для вас. В общем, вы должны следовать методу с _, чтобы сказать scala, чтобы рассматривать его как функцию.

Обратите внимание, это, например, в 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 
+0

Паоло - Думаю, мне нужно сделать еще больше копания. Я тестировал пример в REPL, и он отлично работает (после вырезания кучи кода, связанного с зависимостями), но он просто не будет компилироваться в среде SBT, в которой я работаю. Поэтому я собираюсь немного поэкспериментировать, если ошибка неверно относится к другой проблеме - прежде чем я буду тратить на нее какое-то время. Спасибо за вход ... -mjk – mjk

+0

Paolo - Кажется, насколько я могу судить, быть компилятором «ошибка». Я обновил вопрос, подробно расскажу о том, как дублировать. – mjk

+0

Это не ошибка, а (известное) ограничение при работе с перегрузками метода.См. Это другое описание: http://stackoverflow.com/questions/7816547/can-i-get-a-function-from-an-overloaded-method-in-scala?rq=1 –

Смежные вопросы