如果按照“在Scala中编程”一书中的定义进行操作:
在将一个或多个值包含在括号中时, 变量,Scala会将代码转换为方法的调用 命名为应用该变量
那如何访问数组的元素呢?例如:x(0)
转换为x.apply(0)
吗? (假设x
是一个数组)。我试图执行以上行。它抛出错误。我还尝试了x.get(0),这也引发了错误。
有人可以帮忙吗?
答案 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
方法的任何类型一起使用。