Статьи

Скала — для петель

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

Итак, некоторые моменты:

  1. Нет необходимости явно делать класс ForLoopExampleпубличным. Это потому, что public является уровнем доступа по умолчанию в Scala. Где вы говорили публично в Java, вы ничего не говорите в Scala.
  2. Единственная разница между forExampleWithToи forExampleWithUntilзаключается в том, что один использует toв своем диапазоне, а другой использует until. В этих примерах toозначает 1,2,3,4,5 и untilозначает 1,2,3,4 — т.е. последний элемент не включен.
  3. forExampleWithMultipleRangesпоказывает, как перебрать несколько диапазонов. Кроме того, обратите внимание, что оператор в цикле for заключен в {}. {}Необходимо , когда несколько операторов в каждой итерации. Если есть только одно утверждение, они могут быть опущены.
  4. forExampleWithFilter показывает, как отфильтровать значения из списка.
  5. 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) 
  }
}

И еще несколько важных моментов:

  1. Вместо того, чтобы MainRunner был объявлен как класс, он объявлен как объект. Это означает, что это синглтон.
  2. Метод main () похож на метод Java public static void main. За исключением того, что нет необходимости для общественности (это по умолчанию). Нет необходимости в static (мы находимся в одиночном коде), и нет необходимости объявлять тип возвращаемого значения. Вы видите Scala, вы получаете больше кода с меньшим набором текста.
  3. В некоторых случаях я опускаю () из вызова метода. В тех случаях, когда метод не имеет аргументов, Scala допускает пропуск () . Тем не менее, это обозначение следует использовать только тогда, когда метод не имеет побочных эффектов, т. Е. Метод не изменяет состояние чего-либо — поэтому я использую его здесь только для иллюстрации.

Ну это все. Я надеюсь, у вас был отличный 2012 год и еще лучший 2013 год.