Scala

Материал из Викиучебника — открытых книг для открытого мира
Перейти к навигации Перейти к поиску

Scala — чистый объектно-ориентированный язык в том смысле, что всё, включая числа и функции, является объектами.

Первая программа[править]

Вывод приветствия в консоли:

object HelloWorld{
  def main(args:Array[String]){
    println("Hello,world!")
  }
}

Идентификаторы[править]

Имена могут иметь 4 формы.

  • Буква, за которой последовательность букв, цифр и знака _: xRoom10a, foldl_:
  • Операторный символ, за которым последовательность операторных символов: +, --,
  • Первая и вторая формы разделенные '_': foldl_:
  • Любая последовательность символов в апострофах: `def`, `yield`, `1+1=2`.

Символ $ используется компилятором и в программах он использоваться не должен.

Зарезервированные слова, в качестве идентификатора использоваться не могут.

abstract    case      catch      class      def
do          else      extends    false      final
finally     for       if         implicit   import
match       new       null       object     override
package     private   protected  requires   return
sealed      super     this       throw      trait
try         true      type       val        var
while       with      yield   
_ : = => <- <: < % > : # @ 

Обратные кавычки используются, чтобы обратиться к идентификаторам Java, которые в Scala являются зарезервированными. Пример:

Thread.`yield`()

.

Комментарии[править]

За двумя наклонными чертами подряд //, без пробела между ними, начинается комментарий, продолжающийся до конца строки.

За наклонной чертой и звездочкой /* начинается комментарий, который может занимать несколько строк, до звездочки и наклонной черты */ (без пробелов между этими знаками).

За наклонной чертой и двумя звездочками /** начинается комментарий для документирования, который может занимать несколько строк, до звездочки и наклонной черты */ (без пробелов между этими знаками). Такой комментарий может обрабатываться программой scaladoc, она извлекает эти комментарии в отдельные файлы формата HTML и создает гиперссылки между ними. Так программа самодокументируется. В такой комментарий можно вставить указания программе javadoc, которые начинаются с символа @.

/**
 * Разъяснение содержания и особенностей программы... 
 * @author Имя Фамилия (автора) 
 * @version 1.0 (это версия программы) 
 */ 
object HelloWorld{
  def main(args:Array[String]):Unit={
    Console.println("Hello,world!")
  }
}

Звездочки в начале строк не имеют никакого значения, они написаны просто для выделения комментария.

Литералы[править]

Числа[править]

Целые константы можно записывать в трех системах счисления:

  • в десятичной форме: +5, −7, 12345678 ;
  • в восьмеричной форме, начиная с нуля: 027, −0326, 0777 ; в записи таких констант недопустимы цифры 8 и 9;
  • в шестнадцатеричной форме, начиная с нуля и латинской буквы х или X: 0xff0a, 0xFC2D, 0x45a8, 0X77FF ; здесь строчные и прописные буквы не различаются.

Целые константы хранятся в формате типа scala.Int.

В конце целой константы можно записать букву прописную L или строчную l, тогда константа будет сохраняться в формате типа scala.Long:

+25L, −0371L, OxffL, OXDFDFL .

Не используйте при записи длинных целых констант строчную латинскую букву l, её легко спутать с единицей.

Вещественные числа записываются только в десятичной системе счисления в двух формах:

  • c фиксированной точкой: 37.25, −128.678967, +27.035 ;
  • с плавающей точкой: 2.5е34, −0.345е-25, 37.2Е+4 ; можно писать строчную или прописную латинскую букву Е ; пробелы и скобки недопустимы.

Вещественные константы хранятся в формате типа scala.Double.

В конце вещественной константы можно поставить букву F (или f), тогда константа будет сохраняться в формате типа float:

3.5F, −45.67F, 8.9e-5F.

Символы[править]

Печатные символы записываются в одинарных кавычках: 'а', 'N', '?'.

Управляющие символы записываются в одинарных кавычках с обратной наклонной чертой:

  • '\n' — символ перевода строки;
  • '\r' — символ возврата каретки;
  • '\f' — символ перевода страницы;
  • '\b' — символ возврата на шаг;
  • '\t' — символ горизонтальной табуляции;
  • '\\' — обратная наклонная черта;
  • '\"' — кавычки;
  • '\'' — одинарная кавычка.

Код любого символа в кодировке Unicode набирается в апострофах после обратной наклонной черты и латинской буквы u ровно четырьмя шестнадцатеричными цифрами: '\u0053' — буква S, '\u0416' — буква Ж. Прописные русские буквы в кодировке Unicode занимают диапазон от ' \u0410 ' — заглавная буква А , до ' \u042F ' — заглавная Я, строчные буквы от ' \u0430 ' — а, до ' \u044F ' — я .

В какой бы форме ни записывались символы, компилятор переводит их в Unicode, включая и исходный текст программы. Символы хранятся в формате типа scala.Char.

Строки[править]

Строки символов заключаются в кавычки. Управляющие символы и коды записываются в строках точно так же, с обратной наклонной чертой, но, разумеется, без одинарных кавычек, и оказывают то же действие. Строки могут располагаться только на одной строке исходного кода, нельзя открывающие кавычки поставить на одной строке, а закрывающие — на следующей.

Примеры:

"Это строка\nс переносом" 
"Martin Odersky \"Scala by Example\""

Многострочные строки заключаются в тройные кавычки.

Пример:

"""строка 
   на трех
   линиях"""

Логический тип[править]

Булевские литералы записываются: true и false. Булевские константы хранятся в классе scala.Boolean.

Операции[править]

Сокращения[править]

type byte=scala.Byte
type short=scala.Short
type char=scala.Char
type int=scala.Int
type long=scala.Long
type float=scala.Float
type double=scala.Double
type boolean=scala.Boolean
type String=java.lang.String

Методы[править]

Методы начинаются с зарезервированного слова def. Потом пишется его сигнатура (имя, список параметров и опционально тип возвращаемого значения), ставится знак '=', затем тело метода.

def funcName (m: Int): Int = m + 1

Классы[править]

Определение класса:

class Complex(real:double, imaginary:double){
  def re() = real
  def im() = imaginary
}

Аргументы класса становятся аргументами конструктора, когда мы создаем новый объект этого класса: new Complex(23.4,56.7). Этот класс содержит два метода re и im, дающих доступ к действительной и мнимой части числа. Тип возращаемого значения этих методов не задан явно. Он автоматически выводится компилятором, который смотрит на правую часть методов и решает, что тип обоих методов double.

Case classes[править]

Отличия case classes от обычных:

  • Вы можете использовать распознавание шаблонов по их имени **и** по аргументам конструктора (это очень важно). Обычный класс может быть распознан только по имени — any condition on its members have to be in the guard clause.
  • Новые объекты case class могут быть созданы без ключего слова new.
  • Все аргументы конструктора доступны извне используя автоматически созданные одноименные функции доступа.
  • Метод toString автоматически переопределяется так, чтобы печатать имя case class и все его аргументы.
  • Метод equals автоматически переопределяется так, чтобы сравнивать два объекта по аргументам конструктора.

Case class не может наследовать case class. Тем не менее, case class может быть абстрактным.

Коллекции[править]

Генерация коллекции типа IndexedSeq[+A]:

 val coll1 = 1.to(10) // Или
 val coll2 = for(i<- 1.to(10)) yield i

См. также[править]