некоторые вопросы оператора - PullRequest
2 голосов
/ 21 ноября 2011

Я новичок в scala, извините, если это легко, но мне было трудно найти ответ.

Мне трудно понять, что <- делает, и что делает () => модуль. Я понимаю, что -> иногда используется в foreach, а => используется в картах. Попытка гуглить "scala" <- "не очень плодотворна. Я нашел <a href="http://jim-mcbeath.blogspot.com/2008/12/scala-operator-cheat-sheet.html" rel="nofollow">http://jim -mcbeath.blogspot.com / 2008/12 / scala-operator-cheat-sheet.html но не так полезно, как кажется на первый взгляд.

val numbers = List("one", "two", "three","four","five")
def operateOnList() {
  for(number <- numbers) {
    println(number + ": came out of this crazy thing!")
  }
}

def tweener(method: () => Unit) {
  method()
}

tweener(operateOnList)

Ответы [ 3 ]

5 голосов
/ 21 ноября 2011

() => Unit означает, что метод - это функция, которая не принимает параметров и ничего не возвращает (Unit).

<- используется в для понимания как своего рода оператор присваивания. для понимания немного специфичны, потому что они внутренне преобразованы. В вашем случае это будет преобразовано как numbers.foreach(i => println(i + ": came out of this crazy thing!"))

<- в значении for означает, что мы будем повторять каждый элемент списка numbers и передавать его на number.

4 голосов
/ 21 ноября 2011

'<-' может рассматриваться как 'in', поэтому </p>

for(number <- numbers){
...
}

можно перевести на английский как для каждого числа в цифрах до

'<-' имеет двойника с другой семантикой: '->'. Просто это просто замена запятой в кортежах: (a, b) эквивалентно (a-> b) или просто a-> b. Значение после этих символов состоит в том, что «a» отображает на «b». Так что это часто используется в определении карт:

 Map("a" -> 1,"aba" -> 3)
 Map("London" -> "Britain", "Paris" -> "France")

Здесь вы можете думать о отображении как о проекции (или нет) с помощью некоторой функции (например, «длина строки», «капитал»).

Лучшее объяснение здесь .

И последнее, но не менее важное, это '=>', который тоже map, но с общей семантикой. '=>' используется повсеместно в анонимных выражениях:

scala> List(1,2,3,4).map(current => current+1)
res5: List[Int] = List(2, 3, 4, 5)

Что составляет для каждого элемента карты текущего элемента списка с функцией 'plus one'

List(1,2,3,4).map(c => c%2 match {
     | case 0 => "even"
     | case 1 => "odd"
     | }
     | )
res6: List[java.lang.String] = List(odd, even, odd, even)

Сопоставить текущий элемент с предоставленным шаблоном mathing

3 голосов
/ 21 ноября 2011

В методе

def tweener(method: () => Unit) {
  method()
}

метод называется tweener, параметр произвольно называется method, а тип method равен () => Unit, что является типом функции, как вы можете сказать из =>.

Unit - это тип возврата, аналогичный void в Java, и не представляет интересного возвращаемого значения. Например, тип возврата print равен Unit. () представляет пустой список параметров.

сбивает с толку, () также используется для представления экземпляра Unit, называемого единицей измерения , единственное значение, которое может принимать Unit. Но это , а не , что означает в типе функции () => Unit, точно так же, как вы не можете иметь тип функции 42 => Unit.

Возвращаясь к вашему примеру, tweener принимает функцию типа () => Unit. operateOnList - это метод , но он частично применяется компилятором для преобразования его в значение функции. Вы можете сами превратить методы в функции:

scala> def m = println("hi")
m: Unit

scala> m _
res17: () => Unit = <function0>

operateOnList можно превратить в правильный тип функции, поскольку ее список параметров пуст (), а тип возвращаемого значения - implicity Unit.

В качестве дополнительного примечания: если operateOnList были определены без пустого списка параметров (что допустимо, но более распространено, когда тип возвращаемого значения не является Единицей), вам потребуется частично применить его вручную, иначе его значение будет передано вместо:

def f1() {}
def f2 {}
def g(f: () => Unit) {}
g(f1)   // OK
g(f2)   // error, since we're passing f2's result (), 
        //   rather than partial function () => Unit
g(f2 _) // OK
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...