【问题标题】:Why is Scala's Set.subsets() method defined as an empty-paren method?为什么 Scala 的 Set.subsets() 方法定义为空括号方法?
【发布时间】:2021-11-15 06:57:42
【问题描述】:

Scala 的不可变 Set 类有一个名为 subsets() 的方法,它返回集合的所有子集。

通常为引起副作用的方法保留空括号方法,但这似乎没有。

为什么不将此方法定义为无参数方法?它实际上会引起一些副作用吗?

【问题讨论】:

    标签: scala set parentheses side-effects


    【解决方案1】:

    https://github.com/scala/bug/issues/9116

    因为subsets 已超载。如果一个重载没有括号,则曾经存在类型推断问题。我不知道该类型推断问题是否仍然存在,但作为解决方法添加的括号仍然存在。

    【讨论】:

    • 我认为这是最正确的答案,但您能否详细说明括号将如何解决推理问题?我从链接的问题中发现不是很清楚。
    • 看起来这个 PR 是实际引入更改的地方 github.com/scala/scala/pull/4309
    【解决方案2】:

    因为它们返回一个可变迭代器到子集集,所以处理迭代器会有副作用。因此,对subsets() 的每次调用也会创建一个不同的迭代器,所以

    someSet.subsets() != someSet.subsets()
    

    这表明调用不是引用透明

    另请参阅this discussion,了解其他集合类型 (IterableOnce) 上的类似方法 (iterator())。

    【讨论】:

    • 这是一个很好的论点并且有道理,但我认为实际答案是@Jasper-M 给出的答案;该方法最初是无参数的,并且添加了括号以帮助类型推断。
    • @Ian 这值得商榷。如果您在讨论中阅读Martin Odersky's comment,省略括号将违反统一访问原则(正是这一点使括号成为必要)。我不争辩添加括号是为了解决类型推断问题,但它们应该首先存在。不过,您的电话... ;-)
    • 这确实是值得商榷的,因为对于 Odersky 的说法似乎并没有达成很大的共识 :-P 讨论的最终结论是不要在像 iterator 这样的方法中添加括号。
    • @Ian Fair 点。 ;-)
    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2023-03-25
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多