Статьи

Синтаксис Scala: 7 баллов

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