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

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

发布时间:2020-12-16 08:55:33 所属栏目:安全 来源:网络整理
导读:def m(x: Int): Any = { }var set = new HashSet[Int = Any] set += mset += m set.size现在为2,set.contains(m)为false,因为显然m被部分应用了两次,并且创建了两个函数对象.如果m是一个函数,它按预期工作.如果它们引用相同的方法,我想将函数视为等于.可以这
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中没有方法对象这样的东西.所以除非你比较他们的名字,否则我认为不可能比较两种方法. (可能有可能使用反射,但我不确定这一点,并且它也会非常讨厌 – 你不会有一组函数,但是你需要转换为正确的方法的方法引用又回来了.)

(编辑:李大同)

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

    推荐文章
      热点阅读