Правильное время, чтобы расширить горизонты. Сейчас 2013 год, и я собираюсь начать вести блог о Scala, который я пытаюсь изучить. Я собираюсь начать с петель.
for(i <- 1 to 5){ println(s); }
Довольно легко понять, что здесь происходит, даже не упомянув слово Scala. Эй, это просто цикл for, и да, он повторяет от 1 до 5, и, вероятно, происходит какой-то вывод типа — поскольку Scala статически типизирован. Это все хорошо, но я считаю полезным при попытке выучить новый язык, выучить язык этого языка. Для любого, кто имеет опыт работы с Java, ‘<-‘ определенно гарантирует наличие существительного. Это называется генератором . Зачем? Потому что он генерирует отдельные вейлы из диапазона, который в данном случае составляет от 1 до 5 частей.
В этом примере не так много интересного, кроме намерения двух пробелов — Java-программисты будут использовать до 4. Ну и что еще? В Scala есть два стиля циклов for: foreach и for . Первый предназначен для функционального подхода, и я расскажу об этом в другом посте. Последний подходит для императивного стиля. На самом деле for
и foreach
конструкции являются прекрасным примером того , как Scala упрощает как императивный и функциональный progamming.
Дай мне больше?
Конечно, давайте посмотрим на другие трюки с циклами for, используя императивный подход.
class ForLoopExample { def forExampleWithTo() { println(">>forExampleWithTo()"); for (i <-1 to 5) println("Iteration " + i) } def forExampleWithUntil() { println(">>forExampleWithUntil()"); for (i <-1 until 5) println("Iteration " + i) } def forExampleWithMultipleRanges() { println(">>forExampleWithMultipleRanges()"); for (i <- 1 to 2; j <- 4 to 5) { println("Value of i=" + i); println("Value of j=" + j); } } def forExampleWithFilter() { println(">>forExampleWithFilter"); for (i <- 1 to 5 if i % 2 == 0) { println("Filtered i=" + i); } } //storing results from for loop. def forExampleStoreValues() { println(">>forExampleStoreValues"); val retVal = for{i <- 1 to 5 if i % 2 == 0} yield i; println("retVal=" + retVal); retVal; } }
Итак, некоторые моменты:
- Нет необходимости явно делать класс
ForLoopExample
публичным. Это потому, что public является уровнем доступа по умолчанию в Scala. Где вы говорили публично в Java, вы ничего не говорите в Scala. - Единственная разница между
forExampleWithTo
иforExampleWithUntil
заключается в том, что один используетto
в своем диапазоне, а другой используетuntil
. В этих примерахto
означает 1,2,3,4,5 иuntil
означает 1,2,3,4 — т.е. последний элемент не включен. forExampleWithMultipleRanges
показывает, как перебрать несколько диапазонов. Кроме того, обратите внимание, что оператор в цикле for заключен в{}
.{}
Необходимо , когда несколько операторов в каждой итерации. Если есть только одно утверждение, они могут быть опущены.forExampleWithFilter
показывает, как отфильтровать значения из списка.forExampleStoreValues
показывает, как сохранить результат значений итерации из списка for.
А как насчет того, чтобы вызвать их для примера?
Конечно.
object MainRunner { def main(args: Array[String]){ println("Scala stuff!"); // println comes from Predef which definitions for anything inside a Scala compilation unit. runForExamples(); } def runForExamples() { val forLE = new ForLoopExample(); // No need to declare type. println("forExampleWith()=" + forLE.forExampleWithTo()); // println("forExampleWithUntil=" +forLE.forExampleWithUntil); //() brackets for method invocation not needed. println("forExampleWithFilter=" +forLE.forExampleWithFilter) // semi colans not needed to end lines println("forExampleWithMultipleRanges=" +forLE.forExampleWithMultipleRanges); println("forExampleStoreValues=" +forLE.forExampleStoreValues) } }
И еще несколько важных моментов:
- Вместо того, чтобы MainRunner был объявлен как класс, он объявлен как объект. Это означает, что это синглтон.
- Метод main () похож на метод Java
public static void main
. За исключением того, что нет необходимости для общественности (это по умолчанию). Нет необходимости в static (мы находимся в одиночном коде), и нет необходимости объявлять тип возвращаемого значения. Вы видите Scala, вы получаете больше кода с меньшим набором текста. - В некоторых случаях я опускаю () из вызова метода. В тех случаях, когда метод не имеет аргументов, Scala допускает пропуск () . Тем не менее, это обозначение следует использовать только тогда, когда метод не имеет побочных эффектов, т. Е. Метод не изменяет состояние чего-либо — поэтому я использую его здесь только для иллюстрации.
Ну это все. Я надеюсь, у вас был отличный 2012 год и еще лучший 2013 год.