在Scala中应用/获取方法

时间:2018-08-28 02:13:05

标签: scala apply

如果按照“在Scala中编程”一书中的定义进行操作:

  

在将一个或多个值包含在括号中时,   变量,Scala会将代码转换为方法的调用   命名为应用该变量

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

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

()暗示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视为获取器而不是更改器,

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)

答案 1 :(得分:1)

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

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

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

array(0) == array.apply(0)

答案 2 :(得分:1)

对于

x(1)=200
您在评论中提到的

,答案是不同的。它还会转换为方法调用,但不会转换为apply;而是

x.update(1, 200)

就像apply一样,它可以与定义合适的update方法的任何类型一起使用。