Scala: различия между версиями

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
м +uk
Строка 142: Строка 142:


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


==Классы==
==Классы==

Версия от 02:54, 6 ноября 2010

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

Первая программа

Выдает приветствие:

object HelloWorld{
  def main(args:Array[String]):Unit={
    Console.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. Потом пишется его сигнатура (имя, список параметров и опционально тип возвращаемого значения), ставится знак '=', затем тело метода.

Классы

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

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

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

Case classes

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

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

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