применять / получать методы в Scala - PullRequest
0 голосов
/ 28 августа 2018

Если мы пойдем по определению в книге «Программирование в Scala»:

При применении круглых скобок, окружающих одно или несколько значений, к переменная, Scala преобразует код в вызов метода named применяется к этой переменной

Тогда как насчет доступа к элементам массива? Например: x(0) преобразуется в x.apply(0)? (предположим, что x - это массив). Я пытался выполнить вышеуказанную строку. Это была ошибка. Я также попробовал x.get (0), который также выдавал ошибку.

Может кто-нибудь помочь, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

() подразумевает 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, думайте о применении как получатель, а не мутатор,

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)
0 голосов
/ 28 августа 2018

Для

x(1)=200

, который вы упоминаете в комментарии, ответ другой. Он также переводится в вызов метода, но не в apply; вместо этого

x.update(1, 200)

Так же, как и apply, это будет работать с любым типом, который определяет подходящий метод update.

0 голосов
/ 28 августа 2018

Если вы добавляете метод apply к объекту, вы можете применить этот объект (как вы можете применять функции).

Способ сделать это - просто применить объект, как если бы он был функцией, напрямую с помощью (), без «точки».

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

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