From 4fc19f806f9e49cdcce8bb31606ca58014f4fbac Mon Sep 17 00:00:00 2001 From: "Kotobotov.ru" Date: Tue, 8 Jan 2019 12:07:07 +0700 Subject: [PATCH 1/4] :sparkles: Russian Scala cheatsheet --- _overviews/cheatsheets/index.md | 2 +- _ru/cheatsheets/index.md | 357 ++++++++++++++++++++++++++++++++ 2 files changed, 358 insertions(+), 1 deletion(-) create mode 100644 _ru/cheatsheets/index.md diff --git a/_overviews/cheatsheets/index.md b/_overviews/cheatsheets/index.md index aa27d9e403..b59d3fcdcf 100644 --- a/_overviews/cheatsheets/index.md +++ b/_overviews/cheatsheets/index.md @@ -7,7 +7,7 @@ partof: cheatsheet by: Brendan O'Connor about: Thanks to Brendan O'Connor, this cheatsheet aims to be a quick reference of Scala syntactic constructions. Licensed by Brendan O'Connor under a CC-BY-SA 3.0 license. -languages: [ba, fr, ja, pl, pt-br, zh-cn, th] +languages: [ba, fr, ja, pl, pt-br, zh-cn, th, ru] permalink: /cheatsheets/index.html --- diff --git a/_ru/cheatsheets/index.md b/_ru/cheatsheets/index.md new file mode 100644 index 0000000000..f88cfe4191 --- /dev/null +++ b/_ru/cheatsheets/index.md @@ -0,0 +1,357 @@ +--- +layout: cheatsheet +title: Scalacheat + +partof: cheatsheet + +by: Dima Kotobotov +about: Эта шпаргалка создана благодаря Brendan O'Connor и предназначена для быстрого ознакомления с синтаксическими конструкциями Scala. Лицензия выдана Brendan O'Connor по лицензии CC-BY-SA 3.0. + +language: ru +--- + +###### Contributed by {{ page.by }} +{{ page.about }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
переменные
var x = 5переменная
Хорошо
val x = 5
Плохо
x=6
постоянная
var x: Double = 5явное указание типа переменной
функции
Хорошо
def f(x: Int) = { x*x }
Плохо
def f(x: Int) { x*x }
объявление функции
незаметная ошибка: без = используется процедурный стиль объявления в котором возвращаемый тип обязательно "Unit", это может ввести в заблуждение, поэтому избегайте такого стиля объявления функции
Хорошо
def f(x: Any) = println(x)
Плохо
def f(x) = println(x)
объявление функции
синтаксическая ошибка: для каждого аргумента необходимо указывать его тип.
type R = Doubleпсевдоним для типа
def f(x: R) vs.
def f(x: => R)
вызов по значению
вызов по имени (вычисление аргумента отложено до его непосредственного вызова)
(x:R) => x*xанонимная функция
(1 to 5).map(_*2) vs.
(1 to 5).reduceLeft( _+_ )
анонимная функция: квантификатор (подчеркивание) означает что на это место подставляется каждый элемент из диапазона (от 1 до 5).
(1 to 5).map( x => x*x )анонимная функция: слева от => задается имя для подставляемого элемента, которое мы можем в дальнейшем переиспользовать
Хорошо
(1 to 5).map(2*)
Плохо
(1 to 5).map(*2)
анонимная функция: связанный инфиксный метод. Ради четкого понимания лучше использовать явное указание позиции подставляемого элемента в стиле 2*_.
(1 to 5).map { x => val y=x*2; println(y); y }анонимная функция: стиль блоковой передачи (фигурные скобки обозначают блок), возвращается последнее значение (y).
(1 to 5) filter {_%2 == 0} map {_*2}анонимные функции: конвеерный стиль. в однострочных выражениях можно использовать простые скобки.
def compose(g:R=>R, h:R=>R) = (x:R) => g(h(x))
val f = compose({_*2}, {_-1})
анонимные функции: передача блоков в качестве аргументов
val zscore = (mean:R, sd:R) => (x:R) => (x-mean)/sdкаррирование, явный синтаксис.
def zscore(mean:R, sd:R) = (x:R) => (x-mean)/sdкаррирование, явный синтаксис
def zscore(mean:R, sd:R)(x:R) = (x-mean)/sdкаррирование, синтаксический сахар. но если :
val normer = zscore(7, 0.4) _следом использовать подчеркивание то мы получим частично определенную функцию.
def mapmake[T](g:T=>T)(seq: List[T]) = seq.map(g)Обобщенный тип.
5.+(3); 5 + 3
(1 to 5) map (_*2)
инфиксный тип записи (синтаксический сахар - можно не указывать точку и скобки).
def sum(args: Int*) = args.reduceLeft(_+_)звездочка означает произвольное количество аргументов.
пакеты
import scala.collection._импорд всех членов пакета.
import scala.collection.Vector
import scala.collection.{Vector, Sequence}
выборочный импорт.
import scala.collection.{Vector => Vec28}импорт с переименованием.
import java.util.{Date => _, _}импортировать все из java.util кроме Date.
package pkg в самом начале файла
package pkg { ... }
объявление пакета.
структуры данных
(1,2,3)упорядоченный набор фиксированной длины 3 (кортеж). (Tuple3)
var (x,y,z) = (1,2,3)разложение на отдельные параметры: набор раскладывается через проверку по шаблону на отдельные элементы x, y и z.
Плохо
var x,y,z = (1,2,3)
незаметная ошибка: каждая переменная будет приравнена к упорядоченому набору.
var xs = List(1,2,3)список (неизменяемый).
xs(2)получение элемента по индексу в скобках. (примеры)
1 :: List(2,3)объединение в последовательность.
1 to 5 тоже что и 1 until 6
1 to 10 by 2
задание диапазона (синтаксический сахар).
() (пустые скобки)отдельный член типа Unit используемый для указание отсутствия возвращаемого результата (тоже что C/Java void).
конструкции для контроля
if (check) happy else sadзадание условий.
if (check) happy +
тоже что и
+ if (check) happy else ()
синтаксический сахар (ветка else добавляется автоматически).
while (x < 5) { println(x); x += 1}цикл с условием в блоке while .
do { println(x); x += 1} while (x < 5)цикл с условием и обязательным исполнением в блоке do.
import scala.util.control.Breaks._
+breakable {
+  for (x <- xs) {
+    if (Math.random < 0.1)
+      break
+  }
+}
выход из цикла используя break. (примеры)
for (x <- xs if x%2 == 0) yield x*10 +
тоже что и
+ xs.filter(_%2 == 0).map(_*10)
for представление: работает через набор функции с filter/map
for ((x,y) <- xs zip ys) yield x*y +
тоже что и
+ (xs zip ys) map { case (x,y) => x*y }
for представление: когда слева от <- стоит шаблон (в данном случае это набор из 2х элементов x, y), то происходит распаковка по этому шаблону
for (x <- xs; y <- ys) yield x*y +
тоже что и
+ xs flatMap {x => ys map {y => x*y}}
for comprehension: объединение нескольких выражений через ;
for (x <- xs; y <- ys) {
+  println("%d/%d = %.1f".format(x, y, x/y.toFloat))
+}
for представление: императивно
sprintf-style
for (i <- 1 to 5) {
+  println(i)
+}
for представление: обход диапазона (от 1 до 5) включая его верхнюю границу
for (i <- 1 until 5) {
+  println(i)
+}
for представление: обход диапазона (от 1 до 5) не включая его верхнюю границу
проверка по шаблону
Хорошо
(xs zip ys) map { case (x,y) => x*y }
Плохо
(xs zip ys) map( (x,y) => x*y )
используйте ключевое слово case при передачи аргументов в функцию для проверки по шаблону.
Плохо
+
val v42 = 42
+Some(3) match {
+  case Some(v42) => println("42")
+  case _ => println("Not 42")
+}
“v42” интерпритированно как имя для новой константы любого типа, поэтому “42” выведено.
Хорошо
+
val v42 = 42
+Some(3) match {
+  case Some(`v42`) => println("42")
+  case _ => println("Not 42")
+}
”`v42`” с обратными ковычками интерпритируется как указание на значение существующей константы v42, отображается “Not 42”.
Хорошо
+
val UppercaseVal = 42
+Some(3) match {
+  case Some(UppercaseVal) => println("42")
+  case _ => println("Not 42")
+}
UppercaseVal однако константы, имена которых начинаются заглавной буквы, в проверке по шаблону проверяются на совпадение значения, поэтому при проверке UppercaseVal на совпадение с 3, выводится “Not 42”.
Работа с объектами
class C(x: R)параметр конструктора - x доступен только внутри тела класса
class C(val x: R)
var c = new C(4)
c.x
параметр конструктора - доступен публично, автоматически
class C(var x: R) {
+  assert(x > 0, "positive please")
+  var y = x
+  val readonly = 5
+  private var secret = 1
+  def this() = this(42)
+}
конструктор является телом класса
объявление публичного члена класса
объявление члена с гетером но без сеттера
объявление приватного члена
объявление альтернативного конструктора без аргумента
new{ ... }анонимный класс
abstract class D { ... }задание абстрактного класса. (не создаваемого, только наследуемого)
class C extends D { ... }задание унаследованного класса.
class D(var x: R)
class C(x: R) extends D(x)
наследование класса с конструированием параметров.
object O extends D { ... }задание обьекта существующего в единственном экземпляре (сингэлтон) на основе другого класса.
trait T { ... }
class C extends T { ... }
class C extends D with T { ... }
трейты
описывают какие функции и данные должны быть в классе, возможно также указание конкретной (или общей) реализации а также указание значений переменных. + у трейта нет конструктора. их можно смешивать.
trait T1; trait T2
class C extends T1 with T2
class C extends D with T1 with T2
множественные трейты.
class C extends D { override def f = ...}во избежании ошибок при наследовании и создании методов с одинаковыми названиями необходимо указывать override.
new java.io.File("f")создание объекта.
Плохо
new List[Int]
Хорошо
List(1,2,3)
ошибка: List - это абстрактный класс
вместо этого используйте обьект List (вызываемый без new) который создает новые классы типа List
classOf[String]описание класса.
x.isInstanceOf[String]проверка типа (при исполнении)
x.asInstanceOf[String]приведение типа (при исполнении)
x: Stringприписывание типа (во время компиляции)
\ No newline at end of file From 5cbb5557a6fb75e13d54e30d75f8494e53db5b61 Mon Sep 17 00:00:00 2001 From: "Kotobotov.ru" Date: Wed, 9 Jan 2019 20:10:26 +0700 Subject: [PATCH 2/4] :ok_hand: Updating code due to code review changes. Took 42 minutes --- _ru/cheatsheets/index.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/_ru/cheatsheets/index.md b/_ru/cheatsheets/index.md index f88cfe4191..6c227fcdd5 100644 --- a/_ru/cheatsheets/index.md +++ b/_ru/cheatsheets/index.md @@ -41,7 +41,7 @@ language: ru Хорошо
def f(x: Int) = { x*x }
Плохо
def f(x: Int) { x*x } - объявление функции
незаметная ошибка: без = используется процедурный стиль объявления в котором возвращаемый тип обязательно "Unit", это может ввести в заблуждение, поэтому избегайте такого стиля объявления функции + объявление функции
незаметная ошибка: без = используется процедурный стиль объявления, в котором возвращаемый тип обязательно "Unit". Это может ввести в заблуждение, избегайте такой стиль Хорошо
def f(x: Any) = println(x)
Плохо
def f(x) = println(x) @@ -52,8 +52,8 @@ language: ru псевдоним для типа - def f(x: R) vs.
def f(x: => R) - вызов по значению
вызов по имени (вычисление аргумента отложено до его непосредственного вызова) + def f(x: R) vs.

def f(x: => R) + вызов по значению
вызов по имени (вычисление аргумента отложено) (x:R) => x*x @@ -77,7 +77,7 @@ language: ru (1 to 5) filter {_%2 == 0} map {_*2} - анонимные функции: конвеерный стиль. в однострочных выражениях можно использовать простые скобки. + анонимные функции: конвейерный стиль. В однострочных выражениях можно использовать простые скобки. def compose(g:R=>R, h:R=>R) = (x:R) => g(h(x))
val f = compose({_*2}, {_-1}) @@ -93,11 +93,11 @@ language: ru def zscore(mean:R, sd:R)(x:R) = (x-mean)/sd - каррирование, синтаксический сахар. но если : + каррирование, синтаксический сахар. Но если : val normer = zscore(7, 0.4) _ - следом использовать подчеркивание то мы получим частично определенную функцию. + следом использовать подчеркивание, то мы получим частично определенную функцию. def mapmake[T](g:T=>T)(seq: List[T]) = seq.map(g) @@ -117,7 +117,7 @@ language: ru import scala.collection._ - импорд всех членов пакета. + импорт всех членов пакета. import scala.collection.Vector
import scala.collection.{Vector, Sequence} @@ -149,7 +149,7 @@ language: ru Плохо
var x,y,z = (1,2,3) - незаметная ошибка: каждая переменная будет приравнена к упорядоченому набору. + незаметная ошибка: каждая переменная будет приравнена к упорядоченному набору. var xs = List(1,2,3) @@ -201,7 +201,7 @@ breakable { break } } - выход из цикла используя break. (примеры) + выход из цикла с использованием break. (примеры) for (x <- xs if x%2 == 0) yield x*10 @@ -219,7 +219,7 @@ breakable { for (x <- xs; y <- ys) yield x*y
тоже что и
xs flatMap {x => ys map {y => x*y}} - for comprehension: объединение нескольких выражений через ; + for представление: объединение нескольких выражений через ;
for (x <- xs; y <- ys) {
@@ -254,7 +254,7 @@ Some(3) match {
   case Some(v42) => println("42")
   case _ => println("Not 42")
 }
- “v42” интерпритированно как имя для новой константы любого типа, поэтому “42” выведено. + “v42” интерпретировано как имя для новой константы любого типа, поэтому “42” выведено. Хорошо
@@ -263,7 +263,7 @@ Some(3) match { case Some(`v42`) => println("42") case _ => println("Not 42") } - ”`v42`” с обратными ковычками интерпритируется как указание на значение существующей константы v42, отображается “Not 42”. + ”`v42`” с обратными кавычками интерпретируется как указание на значение существующей константы v42, отображается “Not 42”. Хорошо
@@ -272,7 +272,7 @@ Some(3) match { case Some(UppercaseVal) => println("42") case _ => println("Not 42") } - UppercaseVal однако константы, имена которых начинаются заглавной буквы, в проверке по шаблону проверяются на совпадение значения, поэтому при проверке UppercaseVal на совпадение с 3, выводится “Not 42”. + UppercaseVal однако константы, имена которых начинаются с заглавной буквы, в проверке по шаблону проверяются на совпадение значения. Поэтому при проверке UppercaseVal на совпадение с 3, выводится “Not 42”. Работа с объектами @@ -302,7 +302,7 @@ Some(3) match { abstract class D { ... } - задание абстрактного класса. (не создаваемого, только наследуемого) + задание абстрактного класса (не создаваемого, только наследуемого) class C extends D { ... } @@ -314,7 +314,7 @@ Some(3) match { object O extends D { ... } - задание обьекта существующего в единственном экземпляре (сингэлтон) на основе другого класса. + задание объекта существующего в единственном экземпляре (сингэлтон) на основе другого класса. trait T { ... }
class C extends T { ... }
class C extends D with T { ... } @@ -335,7 +335,7 @@ Some(3) match { Плохо
new List[Int]
Хорошо
List(1,2,3) - ошибка: List - это абстрактный класс
вместо этого используйте обьект List (вызываемый без new) который создает новые классы типа List + ошибка: List - это абстрактный класс
вместо этого используйте объект List (вызываемый без new) который создает новые классы типа List classOf[String] From 0594be080fe89004fd59527a5cb467a730adb116 Mon Sep 17 00:00:00 2001 From: "Kotobotov.ru" Date: Tue, 29 Jan 2019 08:39:26 +0700 Subject: [PATCH 3/4] :art: Improving style Took 14 minutes --- _ru/cheatsheets/index.md | 64 ++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/_ru/cheatsheets/index.md b/_ru/cheatsheets/index.md index 6c227fcdd5..c1796009c7 100644 --- a/_ru/cheatsheets/index.md +++ b/_ru/cheatsheets/index.md @@ -29,11 +29,11 @@ language: ru Хорошо
val x = 5
Плохо
x=6 - постоянная + константа var x: Double = 5 - явное указание типа переменной + явное указание типа функции @@ -41,7 +41,7 @@ language: ru Хорошо
def f(x: Int) = { x*x }
Плохо
def f(x: Int) { x*x } - объявление функции
незаметная ошибка: без = используется процедурный стиль объявления, в котором возвращаемый тип обязательно "Unit". Это может ввести в заблуждение, избегайте такой стиль + объявление функции
незаметная ошибка: без = это процедура с возвращаемым типом "Unit". Такое может ввести в заблуждение Хорошо
def f(x: Any) = println(x)
Плохо
def f(x) = println(x) @@ -61,15 +61,15 @@ language: ru (1 to 5).map(_*2) vs.
(1 to 5).reduceLeft( _+_ ) - анонимная функция: квантификатор (подчеркивание) означает что на это место подставляется каждый элемент из диапазона (от 1 до 5). + анонимная функция: подчеркивание указывает место подставляемого элемента. (1 to 5).map( x => x*x ) - анонимная функция: слева от => задается имя для подставляемого элемента, которое мы можем в дальнейшем переиспользовать + анонимная функция: слева от => задается имя подставляемого элемента, чтоб его можно было переиспользовать Хорошо
(1 to 5).map(2*)
Плохо
(1 to 5).map(*2) - анонимная функция: связанный инфиксный метод. Ради четкого понимания лучше использовать явное указание позиции подставляемого элемента в стиле 2*_. + анонимная функция: запись с использованием инфиксного стиля. Ради четкого понимания лучше использовать явное указание позиции подставляемого элемента в стиле 2*_. (1 to 5).map { x => val y=x*2; println(y); y } @@ -101,15 +101,15 @@ language: ru def mapmake[T](g:T=>T)(seq: List[T]) = seq.map(g) - Обобщенный тип. + обобщенный тип. 5.+(3); 5 + 3
(1 to 5) map (_*2) - инфиксный тип записи (синтаксический сахар - можно не указывать точку и скобки). + инфиксный стиль. def sum(args: Int*) = args.reduceLeft(_+_) - звездочка означает произвольное количество аргументов. + функция с переменным числом аргументов. пакеты @@ -141,15 +141,15 @@ language: ru (1,2,3) - упорядоченный набор фиксированной длины 3 (кортеж). (Tuple3) + кортеж размера 3. (Tuple3) var (x,y,z) = (1,2,3) - разложение на отдельные параметры: набор раскладывается через проверку по шаблону на отдельные элементы x, y и z. + разложение на отдельные элементы: кортеж раскладывается на элементы x, y и z используя сопоставление с образцом. Плохо
var x,y,z = (1,2,3) - незаметная ошибка: каждая переменная будет приравнена к упорядоченному набору. + незаметная ошибка: каждой переменной будет присвоено по кортежу. var xs = List(1,2,3) @@ -161,7 +161,7 @@ language: ru 1 :: List(2,3) - объединение в последовательность. + добавление к списку. 1 to 5 тоже что и 1 until 6
1 to 10 by 2 @@ -169,15 +169,15 @@ language: ru () (пустые скобки) - отдельный член типа Unit используемый для указание отсутствия возвращаемого результата (тоже что C/Java void). + одиночный член типа Unit (тоже что и void в C/Java). - конструкции для контроля + управляющие структуры if (check) happy else sad - задание условий. + условие. if (check) happy @@ -207,45 +207,45 @@ breakable { for (x <- xs if x%2 == 0) yield x*10
тоже что и
xs.filter(_%2 == 0).map(_*10) - for представление: работает через набор функции с filter/map + for-выражение: выражается набором с filter/map for ((x,y) <- xs zip ys) yield x*y
тоже что и
(xs zip ys) map { case (x,y) => x*y } - for представление: когда слева от <- стоит шаблон (в данном случае это набор из 2х элементов x, y), то происходит распаковка по этому шаблону + for-выражение: извлечение элементов с последующим вычислением for (x <- xs; y <- ys) yield x*y
тоже что и
xs flatMap {x => ys map {y => x*y}} - for представление: объединение нескольких выражений через ; + for-выражение: перекрестное объединение
for (x <- xs; y <- ys) {
   println("%d/%d = %.1f".format(x, y, x/y.toFloat))
 }
- for представление: императивно
sprintf-style + for-выражение: императивно
sprintf-style
for (i <- 1 to 5) {
   println(i)
 }
- for представление: обход диапазона (от 1 до 5) включая его верхнюю границу + for-выражение: обход диапазона (от 1 до 5) включая его верхнюю границу
for (i <- 1 until 5) {
   println(i)
 }
- for представление: обход диапазона (от 1 до 5) не включая его верхнюю границу + for-выражение: обход диапазона (от 1 до 5) не включая его верхнюю границу - проверка по шаблону + сопоставление с примером Хорошо
(xs zip ys) map { case (x,y) => x*y }
Плохо
(xs zip ys) map( (x,y) => x*y ) - используйте ключевое слово case при передачи аргументов в функцию для проверки по шаблону. + используйте ключевое слово case при передачи аргументов в функцию для запуска механизма сопоставления с примером. Плохо
@@ -254,7 +254,7 @@ Some(3) match { case Some(v42) => println("42") case _ => println("Not 42") } - “v42” интерпретировано как имя для новой константы любого типа, поэтому “42” выведено. + “v42” интерпретировано как имя для новой константы любого типа, поэтому напечатано “42”. Хорошо
@@ -263,7 +263,7 @@ Some(3) match { case Some(`v42`) => println("42") case _ => println("Not 42") } - ”`v42`” с обратными кавычками интерпретируется как указание на значение существующей константы v42, отображается “Not 42”. + ”`v42`” с обратными кавычками интерпретируется как указание на значение существующей константы v42, напечатано “Not 42”. Хорошо
@@ -272,7 +272,7 @@ Some(3) match { case Some(UppercaseVal) => println("42") case _ => println("Not 42") } - UppercaseVal однако константы, имена которых начинаются с заглавной буквы, в проверке по шаблону проверяются на совпадение значения. Поэтому при проверке UppercaseVal на совпадение с 3, выводится “Not 42”. + UppercaseVal однако константы, имена которых начинаются с заглавной буквы, сопоставляются по значению. Поэтому при сопоставлении UppercaseVal с 3, выводится “Not 42”. Работа с объектами @@ -302,11 +302,11 @@ Some(3) match { abstract class D { ... } - задание абстрактного класса (не создаваемого, только наследуемого) + объявление абстрактного класса (не создаваемого, только наследуемого) class C extends D { ... } - задание унаследованного класса. + объявление класса с наследованием. class D(var x: R)
class C(x: R) extends D(x) @@ -314,7 +314,7 @@ Some(3) match { object O extends D { ... } - задание объекта существующего в единственном экземпляре (сингэлтон) на основе другого класса. + объявление объекта одиночки (Singleton) на основе другого класса. trait T { ... }
class C extends T { ... }
class C extends D with T { ... } @@ -327,7 +327,7 @@ Some(3) match { class C extends D { override def f = ...} - во избежании ошибок при наследовании и создании методов с одинаковыми названиями необходимо указывать override. + при наследовании и создании методов с одинаковыми именами необходимо указывать override. new java.io.File("f") @@ -335,7 +335,7 @@ Some(3) match { Плохо
new List[Int]
Хорошо
List(1,2,3) - ошибка: List - это абстрактный класс
вместо этого используйте объект List (вызываемый без new) который создает новые классы типа List + ошибка: List - это абстрактный класс
вместо этого по соглашению обычно используется объект с именем как у абстрактного типа, который уже создает классы classOf[String] From e15db8d9b8a2fb1df27feec18bd0ac7c82e6674b Mon Sep 17 00:00:00 2001 From: "Kotobotov.ru" Date: Tue, 29 Jan 2019 09:10:43 +0700 Subject: [PATCH 4/4] :art: Improving style Took 13 minutes --- _ru/cheatsheets/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_ru/cheatsheets/index.md b/_ru/cheatsheets/index.md index c1796009c7..83d2e9d7c4 100644 --- a/_ru/cheatsheets/index.md +++ b/_ru/cheatsheets/index.md @@ -335,7 +335,7 @@ Some(3) match { Плохо
new List[Int]
Хорошо
List(1,2,3) - ошибка: List - это абстрактный класс
вместо этого по соглашению обычно используется объект с именем как у абстрактного типа, который уже создает классы + ошибка: List - это абстрактный класс
по соглашению используется объект с именем как у абстрактного класса, который уже создает конкретные экземпляры classOf[String]