加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:27:28 所属栏目:安全 来源:网络整理
导读:我是Scala的新手,能够将函数传递给其他函数非常简洁 – 但是我可以将任意函数引用传递给另一个函数吗?所述功能参数的arity将是固定的(也就是说,我也很好奇你是否可以通过任意arity函数).我不断遇到类型错误.我尝试使用Any但它似乎没有帮助. 例如,我有以下代
我是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)

我得到:

Running with input 4

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

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

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

解决方法

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

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

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

“类CodeRunner”之后的[T]是重要的部分 – 它定义了一个泛型类型T(你可以用另一个大写字母替换T等),它将在类定义中使用.

所以,如果你定义一个方法:

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

然后将其传递给:

val d1 = new CodeRunner(arbitrary_code)

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

d1.run("string")

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读