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 举报,一经查实,本站将立刻删除。