【问题标题】:In Scala, is assignment operator "=" a method call?在 Scala 中,赋值运算符“=”是方法调用吗?
【发布时间】:2013-09-30 05:14:07
【问题描述】:

根据 Scala 书籍“Scala 编程” -

Scala is an object-oriented language in pure form: every value is an object and every operation is a method call. For example, when you say 1 + 2 in Scala, you are actually invoking a method named + defined in class Int.

从这个意义上说,使用“=”运算符的赋值操作呢?这也是一种方法吗?似乎不太可能,因为它必须存在于所有类或某个公共超类(例如 java.lang.Object ?)中,所有类都必须从中继承它。还是不是所有的操作在 Scala 中都是真正的方法调用?

【问题讨论】:

    标签: scala


    【解决方案1】:

    Jatin回答的一点补充。有一种情况= 可以被认为是一个方法调用,但实际上它只是一个语法糖。在丑陋的vars 存在的 Scala 的 OO 部分中,您可以编写以下内容:

    class Test { 
      private var x0: Int = 0
      def x = x0
      def x_=(a: Int) = x0 = a 
    }
    

    然后您可以将新整数分配给x

    scala> val t = new Test
    t: Test = Test@4166d6d3
    
    scala> t.x = 1
    t.x: Int = 1
    

    最后一行将被脱糖为t.x_=(1)。我认为在这种情况下,考虑到语法糖,可以说= 是一个方法调用。

    【讨论】:

    • 您所说的合成糖是什么意思?这是否意味着 scala 编译器在背后做魔术?
    • 是的!那是编译器。 @suud
    • “在 Scala 的 OO 部分,丑陋的 var 存在的地方”——我笑了,但是,这种幽默无助于让 Scala 社区更欢迎新人。但让他们转而学习 Kotlin。
    【解决方案2】:

    不。赋值运算符 (=) 是保留字。以下还有:

    _ : = => : #@

    如需更全面的列表,请参阅§ 1.1。有关= 的更多信息请参见§ 6.12.4

    所以是的,这不是方法调用。

    【讨论】:

    • 在这个列表中还能找到模 (%) 运算符有点令人惊讶。在我看来,它类似于其他基本算术运算符,例如 +、- 等,从这个意义上说,它也可能是一种方法。
    • @Sumit 不是 % 而是 <% 类型参数中隐式视图的语法糖
    【解决方案3】:

    虽然其他答案对于标准 Scala 是正确的,但有一个称为 Scala-Virtualized 的变体,其中 = 和其他控制结构方法调用。

    【讨论】:

    • 我真希望这个项目能被合并到主线 Scala 中。从纯 OO 的角度来看,能够实现 var= 的行为是有意义的,更何况 ifwhile 等。
    猜你喜欢
    • 2018-02-21
    • 1970-01-01
    • 2014-12-26
    • 2020-02-20
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 2017-06-12
    • 2023-03-19
    相关资源
    最近更新 更多