Несколько лет назад я окунулся в язык Scala как хобби. Но одним аспектом, который я нашел сложным, было просто снова разобраться в синтаксисе Scala. Некоторые из них, да, основные вещи могут быть нелогичными в зависимости от вашей точки зрения.
1. Определение метода / функции
Печатая справа, а не слева. Рассмотрим это простое определение функции:
|
1
2
3
|
def sayHello(param: String): String = { "Hello" + param} |
Javaholics заметит:
- Возврат указывается в конце определения метода, а не в начале.
- Тип параметра указывается после имени параметра, а не до.
- Перед телом функции есть =
- Есть два двоеточия (:), один между параметром и типом и один перед возвращаемым типом.
2. Блок
Google «Unit», и вам быстро скажут, что Unit — это версия Java void для Scala. Но пустота Java — это ключевое слово . Модуль Scala — это конечный класс, который имеет только одно значение: () — это как псевдоним без информации. Unit указывает, что метод ничего не возвращает и, следовательно, имеет побочные эффекты, чего мы не хотим делать в Scala. Так это противоречит интуиции? Нет.
Но вот что я нахожу. Если у функции нет возвращаемого типа в определении функции и нет равных, это означает, что Unit неявно является возвращаемым типом. Пример:
|
1
2
3
4
5
|
def procedure { println "This String is not returned"}procedure: ()Unit |
Большое дело? Конечно нет. Но что насчет:
|
1
2
3
|
def procedure { "This String is not returned"} |
Ожидайте, что строка будет возвращена, это не так. Как насчет этого?
|
1
2
3
|
def addNumbers(a: Integer, b: Integer) { return a + b} |
Это даст предупреждение компиляции:
: 12: предупреждение: включающий метод addNumbers имеет тип результата Unit: возвращаемое значение отбрасывается return a + b Компилируется, но ничего не возвращается:
|
1
2
3
|
def addNumbers(a: Integer, b: Integer) { a + b} |
не выдаст предупреждения компиляции, а также ничего не вернет.
3. Подчеркнуть
В анонимных функциях Scala _ похоже на Groovy. В Groovy мы можем умножить все числа от 1 до 5, которые мы можем сделать:
|
1
|
(1..5).collect {it * 2} |
В Scala мы можем сделать:
|
1
|
(1 to 5).map{_*2} |
Однако в Scala ссылка на второй раз _ относится ко второму параметру
|
1
2
|
val ns = List(1, 2, 3, 4)val s0 = ns.foldLeft (0) (_+_) //10 |
4. Передача анонимных функций
Передайте одну анонимную функцию, и вам не понадобятся фигурные скобки. Пройдите два, и вы делаете.
|
1
2
|
def compose(g:R=>R, h:R=>R) = (x:R) => g(h(x)) val f = compose({_*2}, {_-1}) |
5. Арити-0
Когда у метода нет аргументов (arity-0), скобки могут быть опущены при вызове
|
1
2
3
|
size()...size // do it like this |
Но этот метод никогда не должен использоваться, когда метод имеет побочные эффекты. Так,
|
1
2
|
queue.size // okprintln // not ok do println() |
6. Объявите типы параметров
Определения функций / определения методов должны объявлять типы параметров, а литералы функций — нет.
|
1
2
|
def addNumbers(a, b): Number {:1: error: ':' expected but ',' found. |
7. Тернарный оператор
В Scala нет троичного оператора. Есть в Java, Groovy, JavaScript. Python 2.5 добавил поддержку для этого. Вместо этого вы можете сделать if else в одной строке и, если if / else является выражением, вы можете вернуть значение. Например: в Java мы будем делать:
|
1
|
(eurovision.winner == "Ireland") ? "Yippee" : "It's a fix" |
Скала, это:
|
1
|
if (eurovision.winner == "Ireland") "Yippee" else "It's a fix" |
| Опубликовано на Java Code Geeks с разрешения Алекса Стейвли, партнера нашей программы JCG . Смотреть оригинальную статью здесь: Синтаксис Scala: 7 баллов
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |