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课程来处理它们?
如何更改我的
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]它是不能分配给d1它CodeRunner[Int].
泛型类型允许您定义具有占位符类型的类,该占位符类型在实例化对象时指定。编译器很高兴,因为它可以确保一切都是类型安全的,而您也很高兴,因为您可以实例化对象并传入任意类型的值。
要在您的类中使用泛型类型,您可以像这样修改它:
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)。