1

假设有一个名为“delegatedFoo()”的功能委托方法需要作为参数传递给方法(即,scala 的函数指针版本),如下所示:

addMyDelegatedMethod(delegatedFoo)

假设(为简洁起见),该行编译/执行得很好。现在将其更改为:

addMyDelegateOverrideMethod("uh-o", delegatedFoo)

此行将引发编译器异常:myClass 类中的方法 delegatedFoo 缺少参数

问:如何在多参数方法调用中传递委托(引用)?(这甚至可以在 Scala 中完成吗?)

编辑:更准确地说,签名如下:

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

更新:在查看 Paolo 的答案并进行更多实验之后,尽我所能告诉问题(错误?)在涉及重载签名时会出现。(我没有费心把它扔到我上面的例子中,因为它没有被使用——但只是它放在那里似乎让我的编译器头疼):

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 将其视为函数。

例如,在定义之后的 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 回答