Правильное время, чтобы расширить горизонты. Сейчас 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 год.