我可以将任意函数传递给Scala中的另一个函数吗?

Dan*_*owy 7 polymorphism functional-programming scala function arity

我是Scala的新手,能够将函数传递给其他函数非常简洁 - 但是我可以将任意函数引用传递给另一个函数吗?所述功能参数的arity将是固定的(也就是说,我也很好奇你是否可以传递任意arity的函数).我不断遇到类型错误.我尝试过使用Any但它似乎没有帮助.

例如,我有以下代码:

class CodeRunner(val user_defined: (Int) => Unit) {
  def run(input: Int) = {
    user_defined(input)
  }
}

def arbitrary_code(input: Int) = { println("Running with input " + input) }

val d1 = new CodeRunner(arbitrary_code)

d1.run(4)
Run Code Online (Sandbox Code Playgroud)

我得到:

Running with input 4
Run Code Online (Sandbox Code Playgroud)

现在,让我们说我想传递以下函数:

def arbitrary_code(input: String) = { println("Running with input " + input) }
Run Code Online (Sandbox Code Playgroud)

如何更改我的CodeRunner课程来处理它们?

Ben*_*son 9

如何更改我的CodeRunner课程来处理它们?

您可以将任意类型作为类的参数:

class CodeRunner[T](val user_defined: (T) => Unit) {
  def run(input: T) = {
    user_defined(input)
  }
}

def arbitrary_code(input: Int) = { println("Running with input " + input) }

val d1 = new CodeRunner(arbitrary_code)

d1.run(4)

def arbitrary_code2(input: String) = { println("Running with input " + input) }

val d2 = new CodeRunner(arbitrary_code2)

d2.run("hello")
Run Code Online (Sandbox Code Playgroud)

需要注意的是类型d2就是CodeRunner[String]它是不能分配给d1CodeRunner[Int].


Jos*_*cus 3

泛型类型允许您定义具有占位符类型的类,该占位符类型在实例化对象时指定。编译器很高兴,因为它可以确保一切都是类型安全的,而您也很高兴,因为您可以实例化对象并传入任意类型的值。

要在您的类中使用泛型类型,您可以像这样修改它:

class CodeRunner[T] (val user_defined: (T) => Unit) {
  def run(input: T) = {
    user_defined(input)
  }
}
Run Code Online (Sandbox Code Playgroud)

“class CodeRunner”后面的 [T] 是重要的部分——它定义了一个将在类定义中使用的泛型类型 T(您可以将 T 替换为其他大写字母等)。

因此,如果您定义一个方法:

def arbitrary_code(input: String) = { println("Running with input " + input) }
Run Code Online (Sandbox Code Playgroud)

然后将其传入:

val d1 = new CodeRunner(arbitrary_code)
Run Code Online (Sandbox Code Playgroud)

...编译器然后会说“啊哈,对于 CodeRunner 的这个实例,泛型类型 T 是一个字符串”。如果你调用

d1.run("string")
Run Code Online (Sandbox Code Playgroud)

编译器会很高兴,但不会让你传入 d1.run(4)。