.toSet和.toSet()有什么区别?

时间:2015-11-14 16:26:20

标签: scala

撰写List(1,2,3).toSet()而不是List(1,2,3).toSet时会发生什么?第一个表达式返回Boolean。为什么呢?

2 个答案:

答案 0 :(得分:6)

List(1,2,3).toSet()相当于:

List(1,2,3).toSet(())

List(1,2,3).toSet.apply(())

List(1,2,3) toSet ()

List(1,2,3).toSet apply ()

也就是说,您的通话中的()不是空的apply。这是Unit。因此toSet会将List转换为Set。编译器看到(),但知道apply上没有空Set方法,所以它假定您必须尝试在没有Set#apply的情况下调用()括号,并将$ scala -deprecation scala> List(1,2,3).toSet() <console>:11: warning: Adaptation of argument list by inserting () has been deprecated: this is unlikely to be what you want. signature: GenSetLike.apply(elem: A): Boolean given arguments: <none> after adaptation: GenSetLike((): Unit) List(1,2,3).toSet() ^ 作为参数传递给它。

这很令人困惑,这就是不推荐使用这种用法的原因。

var image = new Image;
image.crossOrigin="anonymous"; /* THIS WILL MAKE THE IMAGE CROSS-ORIGIN */
image.src = source;

注意那些弃用警告。

答案 1 :(得分:2)

它等同于Bergi提到的.Set .apply()。

但还有更多;因为apply()方法需要elem: A参数,但在这里我们只是使用toSet()而没有给出任何东西,编译器调整帮助我们(但可能不应该)并将其更改为

GenSetLike((): Unit)

满足签名,但不推荐使用,请检查here.

编辑:如果使用-deprecated运行repl,您应该看到警告

<console>:11: warning: Adaptation of argument list by inserting () has been deprecated: this is unlikely to be what you want.
    signature: GenSetLike.apply(elem: A): Boolean
    given arguments: <none>
    after adaptation: GenSetLike((): Unit)
    List(1,2,3).toSet.apply()
    res1: Boolean = false