微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scala – 如何将方法放入集合中?

def m(x: Int): Any = { }
var set = new HashSet[Int => Any] 
set += m
set += m

set.size现在为2,set.contains(m)为false,因为显然m被部分应用了两次,并且创建了两个函数对象.如果m是一个函数,它按预期工作.如果它们引用相同的方法,我想将函数视为等于.可以这样做吗? (不转向带有键返回的地图以便移除,或者传递其他中间变量)

解决方法

添加之前,使用val fun = m _将方法转换为函数.

执行set = m隐式地创建一个函数,该函数不等于在执行set.contains(m)时创建的函数,例如,在函数上下文中使用m都会创建一个全新的,因此不同的函数对象. (对不起,我刚看到,你已经说过了.)

这没关系,如果你只是需要以某种方式将方法放入集合中,然后使用该集进行所有引用.所以以下工作原理:

def m(x: Int): Any = { }
var set = new HashSet[Int => Any]
set += m
val fun = set.head // should not use head in real code but an iterator
set.contains(fun)

加成:

or passing around other intermediate variables

Scala中没有方法对象这样的东西.所以除非你比较他们的名字,否则我认为不可能比较两种方法. (可能有可能使用反射,但我不确定这一点,并且它也会非常讨厌 – 你不会有一组函数,但是你需要转换为正确的方法方法引用又回来了.)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐