【问题标题】:Scala apply method斯卡拉应用方法
【发布时间】:2012-03-17 04:48:17
【问题描述】:

如果 List(1,2,3) 转换为 List.apply(1,2,3) 那么为什么 new Array[String](3) 不转换为 new Array[String].apply(3)?

我尝试了 Array.apply(3),但语义与 new Array[String](3) 不同。

【问题讨论】:

    标签: scala syntax apply


    【解决方案1】:

    当您调用 new Array[String](3) 时,您正在使用单个参数调用 Array class 上的 Array 构造函数: 3. 或者,当您调用 Array(3) 时,您正在调用 Array object 上的 apply 方法。在 Java 中,这称为静态方法调用。和你想的一样,调用Array.apply(3)

    【讨论】:

      【解决方案2】:

      使用new 表示该机制不是函数应用,而是构造。代码“翻译”为分配内存和调用构造函数。

      【讨论】:

      • 有没有什么方法可以在不调用new的情况下构造对象?
      • @user477768 您总是在不使用new 的情况下创建对象,其中许多您甚至都不会注意到(函数文字、扩充类等)。您可以调用一些为您创建对象的工厂方法(可能最终使用new)。您可以使用反射 (classOf[Foo].newInstance)。如果你真的很热衷,你可以操纵字节码......
      【解决方案3】:

      注意两者的区别

      val a = new Array(3)
      

      val a = Array(3)
      

      第一个创建一个新的Array 对象,其中包含3 个null 元素;第二个使用一个元素创建一个新的 Array 对象,即 3。

      Array(3) 转换为 Array.apply(3),与 List(3) 转换为 List.apply(3) 的方式完全相同。

      【讨论】:

        猜你喜欢
        • 2012-08-24
        • 1970-01-01
        • 2011-09-16
        • 2016-01-31
        • 2017-10-23
        • 1970-01-01
        • 2017-01-19
        • 2021-06-09
        • 2021-11-06
        相关资源
        最近更新 更多