<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://t8.lbstr.eu/index.php?action=history&amp;feed=atom&amp;title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%3AOrionll%2FScala</id>
	<title>Участник:Orionll/Scala - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://t8.lbstr.eu/index.php?action=history&amp;feed=atom&amp;title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%3AOrionll%2FScala"/>
	<link rel="alternate" type="text/html" href="https://t8.lbstr.eu/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Orionll/Scala&amp;action=history"/>
	<updated>2026-11-03T17:55:59Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://t8.lbstr.eu/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Orionll/Scala&amp;diff=42460&amp;oldid=prev</id>
		<title>imported&gt;Fervor в 18:56, 17 апреля 2017</title>
		<link rel="alternate" type="text/html" href="https://t8.lbstr.eu/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Orionll/Scala&amp;diff=42460&amp;oldid=prev"/>
		<updated>2017-04-17T18:56:35Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Recycle}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{q|Могу честно сказать, что если бы кто-нибудь мне показал книгу &amp;quot;Programming in Scala by Martin Odersky, Lex Spoon &amp;amp; Bill Venners&amp;quot; в 2003 году, то я возможно бы никогда не создал [[Groovy]].»|Джеймс Стрэчен, создатель языка Groovy}} — IMHO, не нужно это здесь. Сравнение с каким-то бейсиком, фу --&lt;br /&gt;
&lt;br /&gt;
{{q|[[Haskell]], Scala могут чморить всех. [[OCaml]] может чморить всех кроме Haskell и Scala. [[Erlang]] и [[Clojure]] могут чморить всех кроме Haskell, Scala, OCaml.|Namdak Tonpa}} — и это нинужно — --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Файл:Odersky les iterables.jpg|thumb|right|250px|Мартин]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Scala&amp;#039;&amp;#039;&amp;#039; (Скала, скакалка) — хипстофрикоэнтерпрайзный мультипарадигменный язык программирования со статической типизацией, продукт деятельности немецкого профессора Мартина Одерски. Позиционируется как замена языка [[Жаба|Java™©®]], что вызывает [[Butthurt|глубокое неудовольствие]] у сторонников как Java, так и [[Clojure|Кложуры]], другого перспективного языка программирования под JVM.&lt;br /&gt;
&lt;br /&gt;
== История ==&lt;br /&gt;
В начале 2000-х Одерски работал над языком Pizza, который был создан как площадка для экспериментов над языком Java. В Pizza Одерски сделал параметрический полиморфизм, функции-объекты первого класса, паттерн-матчинг и прочую функциональщину. Однако только дженерики в итоге перекочевали в Джаву, а от остального отказались. Дабы не пропадать добру, Одерски решил взять свои наработки и создал в 2003 году первый компилятор языка Scala, который как и Java, компилируется в байт-код JVM.&lt;br /&gt;
&lt;br /&gt;
== Java++ ==&lt;br /&gt;
По идее, язык Scala задумывался таким образом, чтобы на нём могли писать абсолютно все, начиная от нубов-[[Хеллоуворлдщик|хеллоуворлдщиков]] и заканчивая продвинутыми девелоперами-[[Нерд|задротами]], в конец упоротыми такими вещами как теоркат, функторы и монады (в отличие от [[Haskell]], который способны осилить только последние). К несчастью, Скала не защищает от возможности писать гавнокод на ней, и жабакодеры, пересаживающиеся на Скалу, продолжают писать в своём привычном джава-стайле. Поэтому в команде должен быть хотя бы один человек, который хорошо знает Скалу и который давал бы по рукам всем остальным.&lt;br /&gt;
&lt;br /&gt;
Ходят слухи [http://ru.xored.com/2012/12/02/scala/#], что Scala для Java есть ни что иное как [[C++]] для [[C]]. Но никто (даже труп страуса) в совершенстве не знает C++. Каждая C++ команда изобретает свой C++ диалект и презирает другие команды, которые пишут на «другом C++». Такая же участь может постигнуть и Scala. Однако есть и противоположное мнение [http://habrahabr.ru/post/99347/], что «в отличие от C++, Scala становится тем проще, чем дальше её изучаешь».&lt;br /&gt;
&lt;br /&gt;
В любом случае, факт остается фактом, что одну и ту же задачу на Scala можно решить [[стопицот|многими]] способами, даже если это простой «Hello World», и этот аргумент явно не в пользу Scala.&lt;br /&gt;
&lt;br /&gt;
== ООП + ФП ==&lt;br /&gt;
[[Файл:Freeks hipsters enterprise.png|thumb|right|260px|Ниша Scala]]&lt;br /&gt;
Scala — это ООП + ФП. То есть можно писать и ООП, можно и ФП. А некоторые скалолазы умудряются даже неплохо совмещать.&lt;br /&gt;
&lt;br /&gt;
ООП в Скале отличается от ООП в жабе/C#: в Скале есть множественное наследование. Но множественное наследование это правильное, не как в плюсах — реализуется через trait&amp;#039;ы (они же примеси — интерфейсы, у которых можно реализовывать методы), причем важен порядок наследования от примесей. [[Google|Гуглить]] на тему stackable modifications, если интересно.&lt;br /&gt;
&lt;br /&gt;
ФП в Скале также отличается от ФП в ML, Haskell, F# и других чисто функциональных (без ООП) языках со статической типизацией. Главное отличие — отсутствие type union&amp;#039;ов (которое, хотя, легко имитируется через наследование и case-классы). Второе — это отсутствие полного вывода типов, из-за чего программы на Scala получаются зачастую более громоздкими, чем например в Хаскеле, потому что часто приходится явно указывать типы параметризованных классов.&lt;br /&gt;
&lt;br /&gt;
== Фичи языка ==&lt;br /&gt;
* Функции ничем не хуже, чем другие типы данных. Функции могут быть объявлены внутри других функций, могут возвращаться из функций и приниматься в качестве их аргументов.&lt;br /&gt;
* Вменяемые обобщенные типы&lt;br /&gt;
В отличие от приплюснутых непроверяемых препроцессором шаблонов и стираемых во имя бобра и энтерпрайза джавовских дженериков, в Scala таки есть обобщенные классы и методы типы с контролем типов. Самый простой случай Java-style &amp;lt;source lang=&amp;quot;scala&amp;quot;&amp;gt;class Tree[Type] {&lt;br /&gt;
    var node: Type = _&lt;br /&gt;
    var left : Tree[Type] = _&lt;br /&gt;
    var right : Tree[Type] = _&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
А вот класс Tree, который принимает в качестве параметра типа только числовые типы, то есть&lt;br /&gt;
любой из числовых типов Scala и их потомков &amp;lt;source lang=&amp;quot;scala&amp;quot;&amp;gt;class NumericTree[Type &amp;lt;% AnyVal] {&lt;br /&gt;
    var node : Type = _&lt;br /&gt;
    var left : Tree[Type] = _&lt;br /&gt;
    var right : Tree[Type] = _&lt;br /&gt;
}&amp;lt;/source&amp;gt;. Соответсвенно, можно указать и ограничение на типы предков и даже оба ограничения: и на предков и на потомков параметра обобщённого типа.&lt;br /&gt;
* case-классы и паттерн-матчинг:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;scala&amp;quot;&amp;gt;sealed trait Tree&lt;br /&gt;
case class Leaf(val v: Int) extends Tree&lt;br /&gt;
case class Node(val left: Tree, val right: Tree) extends Tree&lt;br /&gt;
&lt;br /&gt;
/** Посчитать сумму дерева */&lt;br /&gt;
def sum(tree: Tree): Int = tree match {&lt;br /&gt;
  case Leaf(v) =&amp;gt; v&lt;br /&gt;
  case Node(left, right) =&amp;gt; sum(left) + sum(right)&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Аналогичный жабакод занял бы в 10 раз больше места.&lt;br /&gt;
&lt;br /&gt;
Признак sealed означает, что иерархия закрыта и никакой анонимус не сможет отнаследоваться от trait&amp;#039;а &amp;lt;code&amp;gt;Tree&amp;lt;/code&amp;gt;. Оператор case означает, что Scala-компайлер нагенерит для классов &amp;lt;code&amp;gt;Leaf&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Node&amp;lt;/code&amp;gt; кучу шаблонных методов типа &amp;lt;code&amp;gt;equals&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hashCode&amp;lt;/code&amp;gt; (чтобы сравнивать) и &amp;lt;code&amp;gt;apply&amp;lt;/code&amp;gt; (чтобы не писать каждый раз new).&lt;br /&gt;
&lt;br /&gt;
Особенно крутая вещь — можно матчиться по вложенным паттернам (например, &amp;lt;code&amp;gt;Node(Leaf(5), Leaf(v))&amp;lt;/code&amp;gt;).&lt;br /&gt;
* object — встроенный в язык правильный синглтон (без всей этой вашей double checked locking и другой громоздкой хуиты)&lt;br /&gt;
* lazy — инициализация происходит в момент первого использования, что в некоторых задачах экономит память&lt;br /&gt;
* for-компрехеншены. Например, найти названия всех книг, среди авторов которых есть тот, чья фамилия начинается со слова Gosling:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;scala&amp;quot;&amp;gt;for {&lt;br /&gt;
  b &amp;lt;- books;&lt;br /&gt;
  a &amp;lt;- b.authors&lt;br /&gt;
  if a startsWith &amp;quot;Gosling&amp;quot;&lt;br /&gt;
} yield b.title&amp;lt;/source&amp;gt;&lt;br /&gt;
* В Scala есть implicit&amp;#039;ы, с помощью которых можно неявно привести что угодно к чему угодно. При чрезмерном использовании делает код абсолютно нечитаемым.&lt;br /&gt;
* Могучая иерархия коллекций с кучей методов. В одном только интерфейсе Iterable over 104 метода. Пример использования:&lt;br /&gt;
Создаем список из чисел от 1 до 20 и делим его на два списка: с чётными и нечётными элементами &amp;lt;source lang=&amp;quot;scala&amp;quot;&amp;gt;val (odd, even) = (1 to 20).toList.partition(f =&amp;gt; f % 2 == 0)&amp;lt;/source&amp;gt;, а затем считаем их суммы: можно &amp;#039;&amp;#039;&amp;#039;так&amp;#039;&amp;#039;&amp;#039;&amp;lt;source lang=&amp;quot;scala&amp;quot;&amp;gt;val sumEven = even.fold(0)(_ + _)&lt;br /&gt;
val sumOdd = odd.fold(0)(_ + _)&amp;lt;/source&amp;gt;, а можно и &amp;#039;&amp;#039;&amp;#039;так&amp;#039;&amp;#039;&amp;#039;&amp;lt;source lang=&amp;quot;scala&amp;quot;&amp;gt;val sumEven = even.sum;&lt;br /&gt;
val sumOdd = odd.sum;&amp;lt;/source&amp;gt;&lt;br /&gt;
Анонимусу может быть интересно, каким образом работает &amp;lt;code&amp;gt;odd.sum&amp;lt;/code&amp;gt;. Ответ прост: есть implicit из &amp;lt;code&amp;gt;Int&amp;lt;/code&amp;gt; в специальный класс &amp;lt;code&amp;gt;Numeric&amp;lt;/code&amp;gt;, а метод &amp;lt;code&amp;gt;sum&amp;lt;/code&amp;gt; принимает на вход этот самый &amp;lt;code&amp;gt;Numeric&amp;lt;/code&amp;gt; (неявно).&lt;br /&gt;
&lt;br /&gt;
== Где используется ==&lt;br /&gt;
Ви таки будете смеяться, но — в банках. То есть там же, где и [[SQL|сракле]].&lt;br /&gt;
&lt;br /&gt;
== Мемы ==&lt;br /&gt;
&amp;lt;!--{{stub}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
{{Языки программирования}}--&amp;gt;&lt;/div&gt;</summary>
		<author><name>imported&gt;Fervor</name></author>
	</entry>
</feed>