diff --git a/_cheatsheets/index.md b/_cheatsheets/index.md index 2b4cc489ec..41e35e3eb2 100644 --- a/_cheatsheets/index.md +++ b/_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, ru] +languages: [ba, fr, ja, pl, pt-br, zh-cn, th, ru, uk] --- @@ -220,7 +220,6 @@ languages: [ba, fr, ja, pl, pt-br, zh-cn, th, ru]
import scala.util.control.Breaks._
-
breakable {
for (x <- xs) {
if (Math.random < 0.1)
diff --git a/_uk/cheatsheets/index.md b/_uk/cheatsheets/index.md
new file mode 100644
index 0000000000..24412df349
--- /dev/null
+++ b/_uk/cheatsheets/index.md
@@ -0,0 +1,624 @@
+---
+layout: cheatsheet
+title: Scala Cheatsheet
+
+partof: cheatsheet
+
+by: Dmytro Kazanzhy
+about: Ця шпаргалка створена завдяки Brendan O'Connor, та призначена для швидкого ознайомлення з синтаксичними конструкціями Scala. Ліцензовано Brendan O'Connor за ліцензією CC-BY-SA 3.0.
+
+language: uk
+---
+
+###### Contributed by {{ page.by }}
+
+{{ page.about }}
+
+
+
+
+
+
+
+
+ змінні
+
+
+
+ var x = 5
Вірно
x = 6
+ Змінна.
+
+
+ val x = 5
Невірно
x = 6
+ Константа (значення).
+
+
+ var x: Double = 5
+ Явне вказання типу.
+
+
+ функції
+
+
+
+ Вірно
def f(x: Int) = { x * x }
Невірно
def f(x: Int) { x * x }
+ Визначення функції.
Прихована помилка: без =
це процедура, що повертає Unit
та може ввести в оману. Не підтримується зі Scala 2.13.
+
+
+ Вірно
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 to 5).map(x => x * x)
+ Анонімна функція: щоб використати аргумент двічі, треба його назвати. Зліва від =>
задається ім'я змінної, якій буде присвоєно аргумент та яку можна використати справа.
+
+
+ (1 to 5).map { x =>
+ val y = x * 2
+ println(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(_+_)
+ Varargs (аргументи змінної довжини).
+
+
+ пакети
+
+
+
+ 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 {
+ ...
+}
Пакет одиночка (singleton): package object pkg {
+ ...
+}
+ Оголошення пакету.
+
+
+ структури даних
+
+
+
+ (1, 2, 3)
+ Кортеж (Tuple). Трансформується у виклик Tuple3
.
+
+
+ var (x, y, z) = (1, 2, 3)
+ Деструктивна прив'язка: кортеж розпаковується через зіставлення зі зразком (pattern matching).
+
+
+ Невірно
var x, y, z = (1, 2, 3)
+ Прихована помилка: кожна змінна прив'язана до всього кортежу.
+
+
+ var xs = List(1, 2, 3)
+ Список (імутабельний, тобто такий, що не змінюється).
+
+
+ xs(2)
+ Індексація через дужки (slides).
+
+
+ 1 :: List(2, 3)
+ Додавання елементу до голови списку.
+
+
+ 1 to 5
так само, як і 1 until 6
1 to 10 by 2
+ Синтаксичний цукор для діапазонів.
+
+
+ ()
+ Пусті дужки це єдине значення для типу Unit.
Еквівалентно до void
у C та Java.
+
+
+ управляючі конструкти
+
+
+
+ if (check) happy else sad
+ Умовний конструкт.
+
+
+ if (check) happy
+
так само, як і
+ if (check) happy else ()
+ Умовний конструкт (синтаксичний цукор).
+
+
+ while (x < 5) {
+ println(x)
+ x += 1
+}
+ Цикл while.
+
+
+ do {
+ println(x)
+ x += 1
+} while (x < 5)
+ Цикл do-while.
+
+
+ import scala.util.control.Breaks._
+breakable {
+ for (x <- xs) {
+ if (Math.random < 0.1)
+ break
+ }
+}
+ Break (slides).
+
+
+ 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: деструктивна прив'язка.
+
+
+ for (x <- xs; y <- ys)
+ yield x * y
+
так само, як і
+ xs flatMap { x =>
+ ys map { y =>
+ x * y
+ }
+}
+ Цикл for: декартів добуток.
+
+
+ for (x <- xs; y <- ys) {
+ val div = x / y.toFloat
+ println("%d/%d = %.1f".format(x, y, div))
+}
+ Цикл for: імперативізм.
стильsprintf
.
+
+
+ for (i <- 1 to 5) {
+ println(i)
+}
+ Цикл for: ітерація з включенням верхньої межі.
+
+
+ for (i <- 1 until 5) {
+ println(i)
+}
+ Цикл for: ітерація без включення верхньої межі.
+
+
+ зіставлення із зразком (pattern matching)
+
+
+
+ Вірно
(xs zip ys) map {
+ case (x, y) => x * y
+}
Невірно
(xs zip ys) map {
+ (x, y) => x * y
+}
+ Для зіставлення зі зразком необхідно використати case
перед аргументами анонімної функції.
+
+
+ Невірно
+ val v42 = 42
+24 match {
+ case v42 => println("42")
+ case _ => println("Not 42")
+}
+ v42
буде інтерпретовано як ім'я змінної у зразку, яка буде вірно зіставлена з будь-яким Int значенням, і буде виведено “42”.
+
+
+ Вірно
+ val v42 = 42
+24 match {
+ case `v42` => println("42")
+ case _ => println("Not 42")
+}
+ `v42`
у зворотних галочках буде інтерпретовано як значення наявної змінної v42
, і буде виведено “Not 42”.
+
+
+ Вірно
+ val UppercaseVal = 42
+24 match {
+ case UppercaseVal => println("42")
+ case _ => println("Not 42")
+}
+ UppercaseVal
буде інтерпретовано так само як наявна змінна, а не нова змінна в патерні. Тому значення, що міститься в UppercaseVal
буде порівняно з 24
, і буде виведено “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)
+}
+ Тіло класу є конструктором.
Оголосити відкритий (public) атрибут.
Оголосити атрибут, доступний тільки на читання.
Оголосити закритий (private) атрибут.
Альтернативний конструктор.
+
+
+ new {
+ ...
+}
+ Анонімний клас.
+
+
+ abstract class D { ... }
+ Визначити абстрактний клас (без можливості створення об'єкту).
+
+
+ class C extends D { ... }
+ Визначити клас, що наслідує інший.
+
+
+ class D(var x: R)
class C(x: R) extends D(x)
+ Наслідування та параметри конструктора (за замовчуванням відбувається передача аргументів).
+
+
+ object O extends D { ... }
+ Визначити єдиний екземпляр (singleton).
+
+
+ trait T { ... }
class C extends T { ... }
class C extends D with T { ... }
+ Риси - трейти (traits).
Інтерфейси-з-імплементацією. У трейту немає параметрів конструктора. композиція з домішками (mixin).
+
+
+ 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 = ...}
+ При реалізації вже наявного методу необхідно вказати overrides
.
+
+
+ new java.io.File("f")
+ Створення об'єкту.
+
+
+ Невірно
new List[Int]
Вірно
List(1, 2, 3)
+ Помилка типу: абстрактний тип.
Натомість, існує конвенція у таких випадках використовувати фабричний метод обʼєкту компаньйону, що приховує конкретний тип.
+
+
+ classOf[String]
+ Літерал класу (Class[String] = class java.lang.String
).
+
+
+ x.isInstanceOf[String]
+ Перевірка типу під час виконання (runtime).
+
+
+ x.asInstanceOf[String]
+ Приведення типу під час виконання (runtime).
+
+
+ x: String
+ Приписування типу під час компіляції (compile time).
+
+
+
+ опції (options)
+
+
+
+ Some(42)
+ Конструктор для непустого опціонального значення (тип Some[T]
).
+
+
+ None
+ Одинак (Singleton) пустого опціонального значення (тип None
).
+
+
+ Option(null) == None
+Option(24) == Some(24)
+ obj.unsafeMethod // number or null
+Option(obj.unsafeMethod) // Some or None
+ проте
+ Some(null) != None
+ Null-safe фабрика опціональних значень.
+
+
+ val optStr: Option[String] = None
+ так само, як і
+ val optStr = Option.empty[String]
+ Явна типізація опціонального значення.
Фабричний метод для створення пустих опціональних значень.
+
+
+ val name: Option[String] =
+ request.getParameter("name")
+val upper = name.map {
+ _.trim
+} filter {
+ _.length != 0
+} map {
+ _.toUpperCase
+}
+println(upper.getOrElse(""))
+ Конвеєрний стиль.
+
+
+ val upper = for {
+ name <- request.getParameter("name")
+ trimmed <- Some(name.trim)
+ if trimmed.length != 0
+ upper <- Some(trimmed.toUpperCase)
+} yield upper
+println(upper.getOrElse(""))
+ Синтаксис for-виразу.
+
+
+ option.map(f(_))
+ так само, як і
+ option match {
+ case Some(x) => Some(f(x))
+ case None => None
+}
+ Застосування функції до опціонального значення.
+
+
+ option.flatMap(f(_))
+ так само, як і
+ option match {
+ case Some(x) => f(x)
+ case None => None
+}
+ Так само, як і map
б але функція має повернути опціональне значення.
+
+
+ optionOfOption.flatten
+ так само, як і
+ optionOfOption match {
+ case Some(Some(x)) => Some(x)
+ case _ => None
+}
+ Вилучення вкладених опціональних значень.
+
+
+ option.foreach(f(_))
+ так само, як і
+ option match {
+ case Some(x) => f(x)
+ case None => ()
+}
+ Застосувати процедуру на опціональному значенні.
+
+
+ option.fold(y)(f(_))
+ так само, як і
+ option match {
+ case Some(x) => f(x)
+ case None => y
+}
+ Застосувати функцію на опціональному значенні та повернути значення, якщо воно порожнє.
+
+
+ option.collect {
+ case x => ...
+}
+ так само, як і
+ option match {
+ case Some(x) if f.isDefinedAt(x) => ...
+ case Some(_) => None
+ case None => None
+}
+ Виконати часткове зіставлення зі зразком опціонального значення.
+
+
+ option.isDefined
+ так само, як і
+ option match {
+ case Some(_) => true
+ case None => false
+}
+ true
якщо не порожнє.
+
+
+ option.isEmpty
+ так само, як і
+ option match {
+ case Some(_) => false
+ case None => true
+}
+ true
якщо порожнє.
+
+
+ option.nonEmpty
+ так само, як і
+ option match {
+ case Some(_) => true
+ case None => false
+}
+ true
якщо не порожнє.
+
+
+ option.size
+ так само, як і
+ option match {
+ case Some(_) => 1
+ case None => 0
+}
+ 0
якщо порожнє, інакше 1
.
+
+
+ option.orElse(Some(y))
+ так само, як і
+ option match {
+ case Some(x) => Some(x)
+ case None => Some(y)
+}
+ Обчислити та повернути альтернативне опціональне значення, якщо порожнє.
+
+
+ option.getOrElse(y)
+ так само, як і
+ option match {
+ case Some(x) => x
+ case None => y
+}
+ Обчислити та повернути значення за замовчуванням, якщо порожнє.
+
+
+ option.get
+ так само, як і
+ option match {
+ case Some(x) => x
+ case None => throw new Exception
+}
+ Повернути значення, або згенерувати виключення, якщо порожнє.
+
+
+ option.orNull
+ так само, як і
+ option match {
+ case Some(x) => x
+ case None => null
+}
+ Повернути значення, null
якщо порожнє.
+
+
+ option.filter(f)
+ так само, як і
+ option match {
+ case Some(x) if f(x) => Some(x)
+ case _ => None
+}
+ Фільтрація опціонального значення. Повернути значення, якщо предикат істинний.
+
+
+ option.filterNot(f(_))
+ так само, як і
+ option match {
+ case Some(x) if !f(x) => Some(x)
+ case _ => None
+}
+ Фільтрація опціонального значення. Повернути значення, якщо предикат хибний.
+
+
+ option.exists(f(_))
+ так само, як і
+ option match {
+ case Some(x) if f(x) => true
+ case Some(_) => false
+ case None => false
+}
+ Повернути значення предикату на опціональному значенні або false
якщо порожнє.
+
+
+ option.forall(f(_))
+ так само, як і
+ option match {
+ case Some(x) if f(x) => true
+ case Some(_) => false
+ case None => true
+}
+ Повернути значення предикату на опціональному значенні або true
якщо порожнє..
+
+
+ option.contains(y)
+ так само, як і
+ option match {
+ case Some(x) => x == y
+ case None => false
+}
+ Перевіряє чи дорівнює опціональне значення параметру, false
якщо порожнє.
+
+
+
diff --git a/_uk/index.md b/_uk/index.md
index 211050d3f1..298a5b8a18 100644
--- a/_uk/index.md
+++ b/_uk/index.md
@@ -105,7 +105,7 @@ scala2-sections:
- title: "Шпаргалка"
description: "Зручна шпаргалка з основ синтаксису Scala."
icon: "fa fa-list"
- link: /cheatsheets/index.html
+ link: /uk/cheatsheets/index.html
- title: "Питання-Відповіді"
description: "Відповіді на часті запитання про Scala."
icon: "fa fa-question-circle"