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) 加成:
Scala中没有方法对象这样的东西.所以除非你比较他们的名字,否则我认为不可能比较两种方法. (可能有可能使用反射,但我不确定这一点,并且它也会非常讨厌 – 你不会有一组函数,但是你需要转换为正确的方法的方法引用又回来了.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |