Несколько лет назад я окунулся в язык 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 s 0 = 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 // ok println // 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, являются их собственными. |