【问题标题】:apply/get methods in ScalaScala 中的应用/获取方法
【发布时间】:2018-08-28 02:13:04
【问题描述】:

如果我们按照“Scala 编程”一书中的定义:

当您在一个或多个值周围应用括号时 变量,Scala 会将代码转换为方法的调用 在该变量上命名应用

那么访问数组的元素呢?例如:x(0) 转换为 x.apply(0) ? (假设x 是一个数组)。我试图执行上面的行。它正在抛出错误。我还尝试了 x.get(0),它也抛出了错误。

有人可以帮忙吗?

【问题讨论】:

  • 您遇到了什么错误?编译或运行时错误?如果你只做 x(0),它会起作用吗? x.apply(0) 是访问数组的正确方法,尽管通常您会使用 x(0) 语法而不是显式写出 apply。
  • x(0)x.apply(0) 相同,应该适用于 Array。你得到了什么错误? Array 没有 get() 方法。地图和选项有get() 方法。
  • 对不起,虽然我打算问如下问题.. 我正在运行我的程序如下.. scala> val x = Array(1,2,3) x: Array[Int] = Array(1, 2, 3) scala> x(1)=200 scala> x.apply(1)=200 :13: 错误:在类数组中应用方法缺少参数列表未应用的方法仅转换为函数当需要函数类型时。您可以通过编写 apply _apply(_) 而不是 apply 来明确此转换。 x.apply(1)=200 ^
  • 上面,当我用 x.apply() 替换 x(1) 时,它会抛出错误。我无法在评论部分编辑代码。
  • “它抛出错误”不是一个足够精确的错误描述,我们无法帮助您。 什么不起作用? 如何不起作用?你的代码有什么问题?您收到错误消息吗?错误信息是什么?你得到的结果不是你期望的结果吗?你期望什么结果,为什么,你得到的结果是什么,两者有什么不同?您正在观察的行为不是期望的行为吗?期望的行为是什么,为什么,观察到的行为是什么,它们有何不同?

标签: scala apply


【解决方案1】:

() 暗示apply()

数组示例,

scala> val data = Array(1, 1, 2, 3, 5, 8)
data: Array[Int] = Array(1, 1, 2, 3, 5, 8)

scala> data.apply(0)
res0: Int = 1

scala> data(0)
res1: Int = 1

不相关,但替代方法是使用更安全的方法,即lift

scala> data.lift(0)
res4: Option[Int] = Some(1)

scala> data.lift(100)
res5: Option[Int] = None

**注意:**scala.Array 可以变异,

scala> data(0) = 100

scala> data
res7: Array[Int] = Array(100, 1, 2, 3, 5, 8)

在这里你不能使用apply,把apply想象成一个getter而不是mutator,

scala> data.apply(0) = 100
<console>:13: error: missing argument list for method apply in class Array
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `apply _` or `apply(_)` instead of `apply`.
       data.apply(0) = 100
            ^

如果你想变异,最好使用.update

scala> data.update(0, 200)

scala> data
res11: Array[Int] = Array(200, 1, 2, 3, 5, 8)

用户定义的应用方法,

scala>   object Test {
     | 
     |     case class User(name: String, password: String)
     | 
     |     object User {
     |       def apply(): User = User("updupd", "password")
     |     }
     | 
     |   }
defined object Test

scala> Test.User()
res2: Test.User = User(updupd,password)

【讨论】:

    【解决方案2】:

    如果您向对象添加应用方法,则可以应用该对象(就像您可以应用函数一样)。

    做到这一点的方法是将对象当作函数一样应用,直接使用 (),不带“点”。

    val array:Array[Int] = Array(1,2,3,4)
    
    array(0) == array.apply(0)
    

    【讨论】:

      【解决方案3】:

      对于

      x(1)=200
      

      你在评论中提到的,答案是不同的。它也被转换为方法调用,但不是apply;而是

      x.update(1, 200)
      

      就像apply 一样,这适用于任何定义了合适的update 方法的类型。

      【讨论】:

        猜你喜欢
        • 2017-05-11
        • 2019-07-14
        • 1970-01-01
        • 1970-01-01
        • 2017-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多