【问题标题】:Confusion about mutable and immutable set in scala关于scala中可变和不可变集合的困惑
【发布时间】:2016-03-14 00:02:38
【问题描述】:

您好,我是 scala 新手,我对 set.+(element) 方法感到困惑。 当我这样做时

var set_1: scala.collection.immutable.Set[Int] = scala.collection.immutable.Set[Int](2)
set_1.+=(1)
println(set_1)

val set_1: scala.collection.mutable.Set[Int] = scala.collection.mutable.Set[Int](2)
set_1.+=(1)
println(set_1)

我得到的结果都是Set(1, 2)。第一个我使用“var”和“immutable”,第二个我使用“val”和“mutable”。 .+() 方法的机制是什么?它重新分配变量 set_1 还是修改 set_1 的值? 谁能帮帮我?

【问题讨论】:

    标签: scala


    【解决方案1】:

    在第一种情况下,您使用的是不可变集合,但您将其存储在 var 中。当您调用“+=”时,结果类似于以下内容,除了不是创建新变量 set2 而是将新集合存储在变量 set1 中......

    val set1 = Set(2)
    val set2 = set1 + Set(1)
    

    原始的 Set(2) 永远不会被修改,而是创建一个新的集合。然后将该新集合分配为可变变量 set1 的值。

    在第二种情况下,变量 set1 指向一个可变集合。您创建集合 Set(1),然后修改同一集合以包含 Set(1,2)

    两者都有用例,但我个人大部分时间会使用不可变集,因为它更容易推理。

    【讨论】:

    • 这就是我的猜测。非常感谢。
    • 关于“有效地做”见scala-lang.org/files/archive/spec/2.11/…这很令人困惑,因为第一个例子通常表示为中缀,但语法不影响脱糖。
    • 感谢您注意到这一点。我已经改写了答案,以明确代码只是一个类比,与脱糖不完全匹配
    【解决方案2】:

    在我看来,第一个例子不应该编译。在这种情况下,=+ 是一个运算符,应用于var set_1,但set_1.+= 语法使它看起来像set_1 所指的实例上的常规方法调用。这就是造成混乱的原因。

    【讨论】:

    • 你知道 .+= 语法的目的是什么(带点)吗?是否有可能对所有运营商都这样做?
    • <object>.foo 通常只表示“在<object> 上调用方法foo”(在immutable.Set 上,+= 只是一个常规方法名称)。这正是我认为第一个示例不应该编译的原因。
    • @Dima 不过可以编译,你可以自己试试。所以我认为 .+= 在第一种情况下可以称为 +=。
    • 我知道,可以编译。我只是说,它不应该。
    • 这里是链接。脱糖遵循正常选择;它不关心它是否表示为中缀表示法。 scala-lang.org/files/archive/spec/2.11/…
    猜你喜欢
    • 1970-01-01
    • 2011-11-24
    • 2012-01-07
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多