【发布时间】:2021-11-15 06:57:42
【问题描述】:
Scala 的不可变 Set 类有一个名为 subsets() 的方法,它返回集合的所有子集。
通常为引起副作用的方法保留空括号方法,但这似乎没有。
为什么不将此方法定义为无参数方法?它实际上会引起一些副作用吗?
【问题讨论】:
标签: scala set parentheses side-effects
Scala 的不可变 Set 类有一个名为 subsets() 的方法,它返回集合的所有子集。
通常为引起副作用的方法保留空括号方法,但这似乎没有。
为什么不将此方法定义为无参数方法?它实际上会引起一些副作用吗?
【问题讨论】:
标签: scala set parentheses side-effects
https://github.com/scala/bug/issues/9116
因为subsets 已超载。如果一个重载没有括号,则曾经存在类型推断问题。我不知道该类型推断问题是否仍然存在,但作为解决方法添加的括号仍然存在。
【讨论】:
因为它们返回一个可变迭代器到子集集,所以处理迭代器会有副作用。因此,对subsets() 的每次调用也会创建一个不同的迭代器,所以
someSet.subsets() != someSet.subsets()
这表明调用不是引用透明。
另请参阅this discussion,了解其他集合类型 (IterableOnce) 上的类似方法 (iterator())。
【讨论】:
iterator 这样的方法中添加括号。