From 10c2fbf75ec35371f044962124f9dee556847b2f Mon Sep 17 00:00:00 2001 From: AstiaSun Date: Tue, 29 Oct 2019 19:17:03 +0200 Subject: [kotlin/uk-ua] Add ukrainian translation for Kotlin --- uk-ua/kotlin-ua.html.markdown | 463 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 463 insertions(+) create mode 100644 uk-ua/kotlin-ua.html.markdown (limited to 'uk-ua') diff --git a/uk-ua/kotlin-ua.html.markdown b/uk-ua/kotlin-ua.html.markdown new file mode 100644 index 00000000..f32a43cd --- /dev/null +++ b/uk-ua/kotlin-ua.html.markdown @@ -0,0 +1,463 @@ +--- +language: kotlin +contributors: + - ["S Webber", "https://github.com/s-webber"] +translators: + = ["AstiaSun", "https://github.com/AstiaSun"] +filename: LearnKotlin.kt +lang: uk-ua +--- + +Kotlin - це мова програмування зі статичною типізацією для JVM, Android та браузера. Вона має 100% сумісність із Java. + +[Детальніше](https://kotlinlang.org/) + +```kotlin +// Однорядкові коментарі починаються з // +/* +Такий вигляд мають багаторядкові коментарі +*/ + +// Ключове слово package працює так само, як і в Java. +package com.learnxinyminutes.kotlin + +/* +Точкою входу для програм на Kotlin є функція під назвою main. +Вона приймає масив із аргументів, що були передані через командний рядок. +Починаючи з Kotlin 1.3, функція main може бути оголошена без параметрів взагалі. +*/ +fun main(args: Array) { + /* + Оголошення змінних відбувається за допомогою ключових слів var або val. + Відмінність між ними полягає в тому, що значення змінних, оголошених через + val, не можна змінювати. Водночас, змінній "var" можна переприсвоїти нове + значення в подальшому. + */ + val fooVal = 10 // більше ми не можемо змінити значення fooVal на інше + var fooVar = 10 + fooVar = 20 // fooVar може змінювати значення + + /* + В більшості випадків Kotlin може визначати, якого типу змінна, тому не + потрібно щоразу точно вказувати її тип. + Тип змінної вказується наступним чином: + */ + val foo: Int = 7 + + /* + Рядки мають аналогічне з Java представлення. Спеціальні символи + позначаються за допомогою зворотнього слеша. + */ + val fooString = "My String Is Here!" + val barString = "Printing on a new line?\nNo Problem!" + val bazString = "Do you want to add a tab?\tNo Problem!" + println(fooString) + println(barString) + println(bazString) + + /* + Необроблений рядок розмежовується за допомогою потрійтих лапок ("""). + Необроблені рядки можуть містити переніс рядка (не спеціальний символ \n) та + будь-які інші символи. + */ + val fooRawString = """ +fun helloWorld(val name : String) { + println("Hello, world!") +} +""" + println(fooRawString) + + /* + Рядки можуть містити шаблонні вирази. + Шаблонний вираз починається із символа доллара "$". + */ + val fooTemplateString = "$fooString has ${fooString.length} characters" + println(fooTemplateString) // => My String Is Here! has 18 characters + + /* + Щоб змінна могла мати значення null, потрібно це додатково вказати. + Для цього після оголошеного типу змінної додається спеціальний символ "?". + Отримати значення такої змінної можна використавши оператор "?.". + Оператор "?:" застосовується, щоб оголосити альтернативне значення змінної + у випадку, якщо вона буде рівна null. + */ + var fooNullable: String? = "abc" + println(fooNullable?.length) // => 3 + println(fooNullable?.length ?: -1) // => 3 + fooNullable = null + println(fooNullable?.length) // => null + println(fooNullable?.length ?: -1) // => -1 + + /* + Функції оголошуються з використанням ключового слова fun. + Аргументи функції перелічуються у круглих дужках після назви функції. + Аргументи можуть мати значення за замовчуванням. Тип значення, що повертатиметься + функцією, вказується після оголошення аргументів за необхідністю. + */ + fun hello(name: String = "world"): String { + return "Hello, $name!" + } + println(hello("foo")) // => Hello, foo! + println(hello(name = "bar")) // => Hello, bar! + println(hello()) // => Hello, world! + + /* + Параменти функції можуть бути помічені ключовим словом vararg. Це дозволяє + приймати довільну кількість аргументів функції зазначеного типу. + */ + fun varargExample(vararg names: Int) { + println("Argument has ${names.size} elements") + } + varargExample() // => Argument has 0 elements + varargExample(1) // => Argument has 1 elements + varargExample(1, 2, 3) // => Argument has 3 elements + + /* + Коли фукнція складається з одного виразу, фігурні дужки не є обов'язковими. + Тіло функції вказується після оператора "=". + */ + fun odd(x: Int): Boolean = x % 2 == 1 + println(odd(6)) // => false + println(odd(7)) // => true + + // Якщо значення, що повертається функцією, може бути однозначно визначено, + // його непотрібно вказувати. + fun even(x: Int) = x % 2 == 0 + println(even(6)) // => true + println(even(7)) // => false + + // Функції можуть приймати інші функції як аргументи, а також повертати інші функції. + fun not(f: (Int) -> Boolean): (Int) -> Boolean { + return {n -> !f.invoke(n)} + } + // Іменовані функції можуть бути вказані як аргументи за допомогою оператора "::". + val notOdd = not(::odd) + val notEven = not(::even) + // Лямбда-вирази також можуть бути аргументами функції. + val notZero = not {n -> n == 0} + /* + Якщо лямбда-вираз приймає лише один параметр, його оголошення може бути пропущене + (разом із ->). Всередині виразу до цього параметра можна звернутись через + змінну "it". + */ + val notPositive = not {it > 0} + for (i in 0..4) { + println("${notOdd(i)} ${notEven(i)} ${notZero(i)} ${notPositive(i)}") + } + + // Ключове слово class використовується для оголошення класів. + class ExampleClass(val x: Int) { + fun memberFunction(y: Int): Int { + return x + y + } + + infix fun infixMemberFunction(y: Int): Int { + return x * y + } + } + /* + Щоб створити новий об'єкт, потрібно викликали конструктор класу. + Зазначте, що в Kotlin немає ключового слова new. + */ + val fooExampleClass = ExampleClass(7) + // Методи класу викликаються через крапку. + println(fooExampleClass.memberFunction(4)) // => 11 + /* + Якщо функція була позначена ключовим словом infix, тоді її можна викликати через + інфіксну нотацію. + */ + println(fooExampleClass infixMemberFunction 4) // => 28 + + /* + Класи даних - це лаконічний спосіб створювати класи, що містимуть тільки дані. + Методи "hashCode"/"equals" та "toString" автоматично генеруються. + */ + data class DataClassExample (val x: Int, val y: Int, val z: Int) + val fooData = DataClassExample(1, 2, 4) + println(fooData) // => DataClassExample(x=1, y=2, z=4) + + // Класи даних також мають функцію "copy". + val fooCopy = fooData.copy(y = 100) + println(fooCopy) // => DataClassExample(x=1, y=100, z=4) + + // Об'єкти можуть бути знищенні кількома способами. + val (a, b, c) = fooCopy + println("$a $b $c") // => 1 100 4 + + // знищення у циклі for + for ((a, b, c) in listOf(fooData)) { + println("$a $b $c") // => 1 100 4 + } + + val mapData = mapOf("a" to 1, "b" to 2) + // Map.Entry також знищується + for ((key, value) in mapData) { + println("$key -> $value") + } + + // Функція із "with" працює майже так само як це ж твердження у JavaScript. + data class MutableDataClassExample (var x: Int, var y: Int, var z: Int) + val fooMutableData = MutableDataClassExample(7, 4, 9) + with (fooMutableData) { + x -= 2 + y += 2 + z-- + } + println(fooMutableData) // => MutableDataClassExample(x=5, y=6, z=8) + + /* + Стисок можна створити використовуючи функцію listOf. + Список буде незмінним, тобто елементи не можна буде додавати або видаляти. + */ + val fooList = listOf("a", "b", "c") + println(fooList.size) // => 3 + println(fooList.first()) // => a + println(fooList.last()) // => c + // доступ до елементів злійснюється через їх порядковий номер. + println(fooList[1]) // => b + + // Змінні списки можна створити використовуючи функцію mutableListOf. + val fooMutableList = mutableListOf("a", "b", "c") + fooMutableList.add("d") + println(fooMutableList.last()) // => d + println(fooMutableList.size) // => 4 + + // Функція setOf створює об'єкт типу множина. + val fooSet = setOf("a", "b", "c") + println(fooSet.contains("a")) // => true + println(fooSet.contains("z")) // => false + + // mapOf створює асоціативний масив. + val fooMap = mapOf("a" to 8, "b" to 7, "c" to 9) + // Доступ до значень в асоціативних масивах здійснюється через їх ключі. + println(fooMap["a"]) // => 8 + + /* + Послідовності представленні як колекції лінивих обчислень. Функція generateSequence + створює послідовність. + */ + val fooSequence = generateSequence(1, { it + 1 }) + val x = fooSequence.take(10).toList() + println(x) // => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + + // Приклад використання послідовностей, генерація чисел Фібоначі: + fun fibonacciSequence(): Sequence { + var a = 0L + var b = 1L + + fun next(): Long { + val result = a + b + a = b + b = result + return a + } + + return generateSequence(::next) + } + val y = fibonacciSequence().take(10).toList() + println(y) // => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] + + // Kotlin має функції вищого порядку для роботи з колекціями. + val z = (1..9).map {it * 3} + .filter {it < 20} + .groupBy {it % 2 == 0} + .mapKeys {if (it.key) "even" else "odd"} + println(z) // => {odd=[3, 9, 15], even=[6, 12, 18]} + + // Цикл for може використовуватись з будь-чим, що має ітератор. + for (c in "hello") { + println(c) + } + + // Принцип роботи циклів "while" не відрізняється від інших мов програмування. + var ctr = 0 + while (ctr < 5) { + println(ctr) + ctr++ + } + do { + println(ctr) + ctr++ + } while (ctr < 10) + + /* + if може бути використаний як вираз, що повертає значення. Тому тернарний + оператор ?: не потрібний в Kotlin. + */ + val num = 5 + val message = if (num % 2 == 0) "even" else "odd" + println("$num is $message") // => 5 is odd + + // "when" використовується як альтернатива в ланцюзі "if-else if". + val i = 10 + when { + i < 7 -> println("first block") + fooString.startsWith("hello") -> println("second block") + else -> println("else block") + } + + // "when" може приймати аргумент. + when (i) { + 0, 21 -> println("0 or 21") + in 1..20 -> println("in the range 1 to 20") + else -> println("none of the above") + } + + // "when" також може використовуватись як функція, що повератє значення. + var result = when (i) { + 0, 21 -> "0 or 21" + in 1..20 -> "in the range 1 to 20" + else -> "none of the above" + } + println(result) + + /* + Тип об'єкта можна перевірити використавши оператор is. Якщо перевірка проходить + успішно, тоді можна використовувати об'єкт як данний тип не приводячи до ного + додатково. + */ + fun smartCastExample(x: Any) : Boolean { + if (x is Boolean) { + // x тепер має тип Boolean + return x + } else if (x is Int) { + // x тепер має тип Int + return x > 0 + } else if (x is String) { + // x тепер має тип String + return x.isNotEmpty() + } else { + return false + } + } + println(smartCastExample("Hello, world!")) // => true + println(smartCastExample("")) // => false + println(smartCastExample(5)) // => true + println(smartCastExample(0)) // => false + println(smartCastExample(true)) // => true + + // Smartcast (розумне приведення) також працює з блоком when + fun smartCastWhenExample(x: Any) = when (x) { + is Boolean -> x + is Int -> x > 0 + is String -> x.isNotEmpty() + else -> false + } + + /* + Розширення - це ще один спобів розширити функціонал класу. + Подібні методи розширення реалізовані у С#. + */ + fun String.remove(c: Char): String { + return this.filter {it != c} + } + println("Hello, world!".remove('l')) // => Heo, word! +} + +// Класи перелічення також подібні до тих типів, що і в Java. +enum class EnumExample { + A, B, C // Константи перелічення розділені комами. +} +fun printEnum() = println(EnumExample.A) // => A + +// Оскільки кожне перелічення - це об'єкт класу enum, воно може бути +// проініціалізоване наступним чином: +enum class EnumExample(val value: Int) { + A(value = 1), + B(value = 2), + C(value = 3) +} +fun printProperty() = println(EnumExample.A.value) // => 1 + +// Кожне перелічення має властивості, які дозволяють отримати його ім'я +// та порядок (позицію) в класі enum: +fun printName() = println(EnumExample.A.name) // => A +fun printPosition() = println(EnumExample.A.ordinal) // => 0 + +/* +Ключове слово object можна виокристати для створення об'єкту сінглтону. Об'єкт не +можна інстанціювати, проте на його унікальний екземпляр можна посилатись за іменем. +Подібна можливість є в сінглтон об'єктах у Scala. +*/ +object ObjectExample { + fun hello(): String { + return "hello" + } + + override fun toString(): String { + return "Hello, it's me, ${ObjectExample::class.simpleName}" + } +} + + +fun useSingletonObject() { + println(ObjectExample.hello()) // => hello + // В Kotlin, "Any" - це корінь ієрархії класів, так само, як і "Object" у Java. + val someRef: Any = ObjectExample + println(someRef) // => Hello, it's me, ObjectExample +} + + +/* +Оператор перевірки на те, що об'єкт не рівний null, (!!) перетворює будь-яке значення в ненульовий тип і кидає ексепшн, якщо значення рівне null. +*/ +var b: String? = "abc" +val l = b!!.length + +// Далі - приклади перевизначення методів класу Any в класі-насліднику +data class Counter(var value: Int) { + // перевизначити Counter += Int + operator fun plusAssign(increment: Int) { + this.value += increment + } + + // перевизначити Counter++ та ++Counter + operator fun inc() = Counter(value + 1) + + // перевизначити Counter + Counter + operator fun plus(other: Counter) = Counter(this.value + other.value) + + // перевизначити Counter * Counter + operator fun times(other: Counter) = Counter(this.value * other.value) + + // перевизначити Counter * Int + operator fun times(value: Int) = Counter(this.value * value) + + // перевизначити Counter in Counter + operator fun contains(other: Counter) = other.value == this.value + + // перевизначити Counter[Int] = Int + operator fun set(index: Int, value: Int) { + this.value = index + value + } + + // перевизначити виклик екземпляру Counter + operator fun invoke() = println("The value of the counter is $value") + +} +// Можна також перевизначити оператори через методи розширення. +// перевизначити -Counter +operator fun Counter.unaryMinus() = Counter(-this.value) + +fun operatorOverloadingDemo() { + var counter1 = Counter(0) + var counter2 = Counter(5) + counter1 += 7 + println(counter1) // => Counter(value=7) + println(counter1 + counter2) // => Counter(value=12) + println(counter1 * counter2) // => Counter(value=35) + println(counter2 * 2) // => Counter(value=10) + println(counter1 in Counter(5)) // => false + println(counter1 in Counter(7)) // => true + counter1[26] = 10 + println(counter1) // => Counter(value=36) + counter1() // => The value of the counter is 36 + println(-counter2) // => Counter(value=-5) +} +``` + +### Подальше вивчення + +* [Уроки Kotlin](https://kotlinlang.org/docs/tutorials/) +* [Спробувати попрацювати з Kotlin в браузері](https://play.kotlinlang.org/) +* [Список корисних посилань](http://kotlin.link/) -- cgit v1.2.3 From 2c8c0caa16d8deaed4139b152caeea037ac9e8fe Mon Sep 17 00:00:00 2001 From: AstiaSun Date: Wed, 30 Oct 2019 22:53:44 +0200 Subject: [cypher/uk-ua] Add ukrainian translation for Cypher query language --- uk-ua/cypher-ua.html.markdown | 254 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 254 insertions(+) create mode 100644 uk-ua/cypher-ua.html.markdown (limited to 'uk-ua') diff --git a/uk-ua/cypher-ua.html.markdown b/uk-ua/cypher-ua.html.markdown new file mode 100644 index 00000000..9cfa35ca --- /dev/null +++ b/uk-ua/cypher-ua.html.markdown @@ -0,0 +1,254 @@ +--- +language: cypher +filename: LearnCypher.cql +contributors: + - ["Théo Gauchoux", "https://github.com/TheoGauchoux"] +translators: + - ["AstiaSun", "https://github.com/AstiaSun"] +lang: uk-ua +--- + +Cypher - це мова запитів Neo4j для спрощення роботи з графами. Вона повторює синтакс SQL та перемішує його з таким собі ascii стилем для відображення стуктури графа. +Цей навчальний матеріал передбачає, що ви вже знайомі із концепцією графів, зобрема що таке вершини та зв'язки між ними. + +[Деталі тут](https://neo4j.com/developer/cypher-query-language/) + + +Вершини +--- + +**Відображує запис у графі.** + +`()` +Таким чином у запиті позначається пуста *вершина*. Використовується зазвичай для того, щоб позначити, що вона є, проте це не так вже й важливо для запиту. + +`(n)` +Це вершина яка має назву **n**, можна повторно користуватись нею у запиті. Звернення до вершини **n** починається з нижнього підкреслення та викоритовує camelCase (верблюжий регіст). + +`(p:Person)` +Можна також додати *ярлик* до вершини, в данному випадку - **Person**. Це як тип / клас / категорія. Назва *ярлика* починається з великої літери та викоритовує верблюжу нотацію. + +`(p:Person:Manager)` +Вершина може мати кілька *ярликів*. + +`(p:Person {name : 'Théo Gauchoux', age : 22})` +Вершина також може мати різні *властивості*, в данному випадку - **name** та **age**. Також мають починаєтися з великої літери та використовувати верблюжу нотацію. + +Наступні типи дозволяється викоритовувати у властивостях: + + - Чиселиний + - Булевий + - Рядок + - Списки попередніх примітивних типів + +*Увага! В Cypher не існує типу, що відображає час. Замість нього можна використовувати рядок із визначеним шаблоном або чисельне відображення певної дати.* + +`p.name` +За допомогою крапки можна звернутись до властивості вершини. + + +Зв'язки (або ребра) +--- + +**Сполучають дві вершини** + +`[:KNOWS]` +Це *зв'язок* з *ярликом* **KNOWS**. Це такий же самий *ярлик* як і у вершини. Починається з великої літери та використовує ВЕРХНІЙ\_РЕГІСТР\_ІЗ\_ЗМІЇНОЮ\_НОТАЦІЄЮ. + +`[k:KNOWS]` +Те же самий *зв'язок*, до якого можна звертатись через змінну **k**. Можна подалі використовувати у запиті, хоч це і не обов'язково. + +`[k:KNOWS {since:2017}]` +Те й же *зв'язок*, але вже із *властивостями* (як у *вершини*), в данному випадку властивіть - це **since**. + +`[k:KNOWS*..4]` +Це стуктурна інформація, яку використовують *шляхи*, які розглянуті нижче. В данному випадку, **\*..4** говорить: "Сумістити шаблон із зв'язком **k**, що повторюватиметься від одного до чотирьох разів." + + +Шляхи +--- + +**Спосіб поєднувати вершини та зв'язки.** + +`(a:Person)-[:KNOWS]-(b:Person)` +Шлях описує, що вершини **a** та **b** знають (knows) один одного. + +`(a:Person)-[:MANAGES]->(b:Person)` +Шлях може бути направленим. Цей описує, що **а** є менеджером **b**. + +`(a:Person)-[:KNOWS]-(b:Person)-[:KNOWS]-(c:Person)` +Можна створювати ланцюги зі зв'язків. Цей шлях описує друга друга (**a** знає **b**, який в свою чергу знає **c**). + +`(a:Person)-[:MANAGES]->(b:Person)-[:MANAGES]->(c:Person)` +Ланцюг, аналогічно, також може бути направленим. Шлях описує, що **a** - бос **b** і супер бос для **c**. + +Шаблони, які часто викоритовуються (з документації Neo4j): + +``` +// Друг-мого-друга +(user)-[:KNOWS]-(friend)-[:KNOWS]-(foaf) + +// Найкоротший шлях +path = shortestPath( (user)-[:KNOWS*..5]-(other) ) + +// Спільна фільтрація +(user)-[:PURCHASED]->(product)<-[:PURCHASED]-()-[:PURCHASED]->(otherProduct) + +// Навігація по дереву +(root)<-[:PARENT*]-(leaf:Category)-[:ITEM]->(data:Product) + +``` + + +Запити на створення +--- + +Створити нову вершину: +``` +CREATE (a:Person {name:"Théo Gauchoux"}) +RETURN a +``` +*`RETURN` дозволяє повернути результат після виконання запиту. Можна повертати кілька значень, наприклад, `RETURN a, b`.* + +Створити новий зв'язок (із двома вершинами): +``` +CREATE (a:Person)-[k:KNOWS]-(b:Person) +RETURN a,k,b +``` + +Запити на знаходження +--- + +Знайти всі вершини: +``` +MATCH (n) +RETURN n +``` + +Знайти вершини за ярликом: +``` +MATCH (a:Person) +RETURN a +``` + +Знайти вершини за ярликом та властивостю: +``` +MATCH (a:Person {name:"Théo Gauchoux"}) +RETURN a +``` + +Знайти вершини відовідно до зв'язків (ненаправлених): +``` +MATCH (a)-[:KNOWS]-(b) +RETURN a,b +``` + +Знайти вершини відовідно до зв'язків (направлених): +``` +MATCH (a)-[:MANAGES]->(b) +RETURN a,b +``` + +Знайти вершини зо допомогою `WHERE`: +``` +MATCH (p:Person {name:"Théo Gauchoux"})-[s:LIVES_IN]->(city:City) +WHERE s.since = 2015 +RETURN p,state +``` + +Можна використовувати вираз `MATCH WHERE` разом із операцією `CREATE`: +``` +MATCH (a), (b) +WHERE a.name = "Jacquie" AND b.name = "Michel" +CREATE (a)-[:KNOWS]-(b) +``` + + +Запити на оновлення +--- + +Оновити окрему властивість вершини: +``` +MATCH (p:Person) +WHERE p.name = "Théo Gauchoux" +SET p.age = 23 +``` + +Оновити всі властивості вершини: +``` +MATCH (p:Person) +WHERE p.name = "Théo Gauchoux" +SET p = {name: "Michel", age: 23} +``` + +Додати нову властивіть до вершини: +``` +MATCH (p:Person) +WHERE p.name = "Théo Gauchoux" +SET p + = {studies: "IT Engineering"} +``` + +Повісити ярлик на вершину: +``` +MATCH (p:Person) +WHERE p.name = "Théo Gauchoux" +SET p:Internship +``` + + +Запити на видалення +--- + +Зидалити окрему вершину (пов'язані ребра повинні бути видалені перед цим): +``` +MATCH (p:Person)-[relationship]-() +WHERE p.name = "Théo Gauchoux" +DELETE relationship, p +``` + +Видалити властивість певної вершини: +``` +MATCH (p:Person) +WHERE p.name = "Théo Gauchoux" +REMOVE p.age +``` + +*Зверніть увагу, що ключове слово `REMOVE` це не те саме, що й `DELETE`!* + +Видалити ярлик певної вершини: +``` +MATCH (p:Person) +WHERE p.name = "Théo Gauchoux" +DELETE p:Person +``` + +Видалити всю базу даних: +``` +MATCH (n) +OPTIONAL MATCH (n)-[r]-() +DELETE n, r +``` + +*Так, це `rm -rf /` на мові Cypher !* + + +Інші корисні запити +--- + +`PROFILE` +Перед виконанням, показати план виконання запитів. + +`COUNT(e)` +Порахувати елементи (вершини та зв'язки), що відповідають **e**. + +`LIMIT x` +Обмежити результат до x перших результатів. + + +Особливі підказки +--- + +- У мові Cypher існують лише однорядкові коментарі, що позначаються двійним слешем : // Коментар +- Можна виконати скрипт Cypher, збережений у файлі **.cql** прямо в Neo4j (прямо як імпорт). Проте, не можна мати мати кілька виразів в цьому файлі (розділених **;**). +- Використовуйте команднйи рядок Neo4j для написання запитів Cypher, це легко і швидко. +- Cypher планує бути стандартною мовою запитів для всіх графових баз даних (більш відома як **OpenCypher**). -- cgit v1.2.3 From b54c2de7e42095cce89a0400211680d04824ba90 Mon Sep 17 00:00:00 2001 From: Anastasiia Bondarenko Date: Thu, 31 Oct 2019 20:44:37 +0200 Subject: Update uk-ua/kotlin-ua.html.markdown Co-Authored-By: Andre Polykanine --- uk-ua/kotlin-ua.html.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'uk-ua') diff --git a/uk-ua/kotlin-ua.html.markdown b/uk-ua/kotlin-ua.html.markdown index f32a43cd..6fd78323 100644 --- a/uk-ua/kotlin-ua.html.markdown +++ b/uk-ua/kotlin-ua.html.markdown @@ -3,7 +3,7 @@ language: kotlin contributors: - ["S Webber", "https://github.com/s-webber"] translators: - = ["AstiaSun", "https://github.com/AstiaSun"] + - ["AstiaSun", "https://github.com/AstiaSun"] filename: LearnKotlin.kt lang: uk-ua --- -- cgit v1.2.3 From 172d93aae70577164de0c9a8d81e931562450508 Mon Sep 17 00:00:00 2001 From: AstiaSun Date: Thu, 31 Oct 2019 22:03:05 +0200 Subject: remove mistakes in words according to the review --- uk-ua/kotlin-ua.html.markdown | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'uk-ua') diff --git a/uk-ua/kotlin-ua.html.markdown b/uk-ua/kotlin-ua.html.markdown index f32a43cd..6e29a721 100644 --- a/uk-ua/kotlin-ua.html.markdown +++ b/uk-ua/kotlin-ua.html.markdown @@ -4,7 +4,7 @@ contributors: - ["S Webber", "https://github.com/s-webber"] translators: = ["AstiaSun", "https://github.com/AstiaSun"] -filename: LearnKotlin.kt +filename: LearnKotlin-uk.kt lang: uk-ua --- @@ -56,7 +56,7 @@ fun main(args: Array) { println(bazString) /* - Необроблений рядок розмежовується за допомогою потрійтих лапок ("""). + Необроблений рядок розмежовується за допомогою потрійних лапок ("""). Необроблені рядки можуть містити переніс рядка (не спеціальний символ \n) та будь-які інші символи. */ @@ -102,7 +102,7 @@ fun helloWorld(val name : String) { println(hello()) // => Hello, world! /* - Параменти функції можуть бути помічені ключовим словом vararg. Це дозволяє + Аргументи функції можуть бути помічені ключовим словом vararg. Це дозволяє приймати довільну кількість аргументів функції зазначеного типу. */ fun varargExample(vararg names: Int) { @@ -113,7 +113,7 @@ fun helloWorld(val name : String) { varargExample(1, 2, 3) // => Argument has 3 elements /* - Коли фукнція складається з одного виразу, фігурні дужки не є обов'язковими. + Коли функція складається з одного виразу, фігурні дужки не є обов'язковими. Тіло функції вказується після оператора "=". */ fun odd(x: Int): Boolean = x % 2 == 1 @@ -303,7 +303,7 @@ fun helloWorld(val name : String) { else -> println("none of the above") } - // "when" також може використовуватись як функція, що повератє значення. + // "when" також може використовуватись як функція, що повертає значення. var result = when (i) { 0, 21 -> "0 or 21" in 1..20 -> "in the range 1 to 20" @@ -313,7 +313,7 @@ fun helloWorld(val name : String) { /* Тип об'єкта можна перевірити використавши оператор is. Якщо перевірка проходить - успішно, тоді можна використовувати об'єкт як данний тип не приводячи до ного + успішно, тоді можна використовувати об'єкт як данний тип не приводячи до нього додатково. */ fun smartCastExample(x: Any) : Boolean { @@ -345,7 +345,7 @@ fun helloWorld(val name : String) { } /* - Розширення - це ще один спобів розширити функціонал класу. + Розширення - це ще один спосіб розширити функціонал класу. Подібні методи розширення реалізовані у С#. */ fun String.remove(c: Char): String { @@ -375,7 +375,7 @@ fun printName() = println(EnumExample.A.name) // => A fun printPosition() = println(EnumExample.A.ordinal) // => 0 /* -Ключове слово object можна виокристати для створення об'єкту сінглтону. Об'єкт не +Ключове слово object можна використати для створення об'єкту сінглтону. Об'єкт не можна інстанціювати, проте на його унікальний екземпляр можна посилатись за іменем. Подібна можливість є в сінглтон об'єктах у Scala. */ @@ -399,7 +399,7 @@ fun useSingletonObject() { /* -Оператор перевірки на те, що об'єкт не рівний null, (!!) перетворює будь-яке значення в ненульовий тип і кидає ексепшн, якщо значення рівне null. +Оператор перевірки на те, що об'єкт не рівний null, (!!) перетворює будь-яке значення в ненульовий тип і кидає виняток, якщо значення рівне null. */ var b: String? = "abc" val l = b!!.length -- cgit v1.2.3 From 6a68f03b5801caf8041c45515a9cc1fa70a7b566 Mon Sep 17 00:00:00 2001 From: AstiaSun Date: Thu, 31 Oct 2019 22:16:50 +0200 Subject: Update word misspelling indicated in the review --- uk-ua/cypher-ua.html.markdown | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'uk-ua') diff --git a/uk-ua/cypher-ua.html.markdown b/uk-ua/cypher-ua.html.markdown index 9cfa35ca..e1eef5a2 100644 --- a/uk-ua/cypher-ua.html.markdown +++ b/uk-ua/cypher-ua.html.markdown @@ -8,7 +8,7 @@ translators: lang: uk-ua --- -Cypher - це мова запитів Neo4j для спрощення роботи з графами. Вона повторює синтакс SQL та перемішує його з таким собі ascii стилем для відображення стуктури графа. +Cypher - це мова запитів Neo4j для спрощення роботи з графами. Вона повторює синтаксис SQL та перемішує його з таким собі ascii стилем для відображення структури графа. Цей навчальний матеріал передбачає, що ви вже знайомі із концепцією графів, зобрема що таке вершини та зв'язки між ними. [Деталі тут](https://neo4j.com/developer/cypher-query-language/) @@ -23,18 +23,18 @@ Cypher - це мова запитів Neo4j для спрощення робот Таким чином у запиті позначається пуста *вершина*. Використовується зазвичай для того, щоб позначити, що вона є, проте це не так вже й важливо для запиту. `(n)` -Це вершина яка має назву **n**, можна повторно користуватись нею у запиті. Звернення до вершини **n** починається з нижнього підкреслення та викоритовує camelCase (верблюжий регіст). +Це вершина, яка має назву **n**, до неї можна повторно звертатись у запиті. Звернення до вершини **n** починається з нижнього підкреслення та використовує camelCase (верблюжий регіст). `(p:Person)` -Можна також додати *ярлик* до вершини, в данному випадку - **Person**. Це як тип / клас / категорія. Назва *ярлика* починається з великої літери та викоритовує верблюжу нотацію. +Можна також додати *ярлик* до вершини, в данному випадку - **Person**. Це як тип / клас / категорія. Назва *ярлика* починається з великої літери та використовує верблюжу нотацію. `(p:Person:Manager)` Вершина може мати кілька *ярликів*. `(p:Person {name : 'Théo Gauchoux', age : 22})` -Вершина також може мати різні *властивості*, в данному випадку - **name** та **age**. Також мають починаєтися з великої літери та використовувати верблюжу нотацію. +Вершина також може мати різні *властивості*, в данному випадку - **name** та **age**. Також мають починатися з великої літери та використовувати верблюжу нотацію. -Наступні типи дозволяється викоритовувати у властивостях: +Наступні типи дозволяється використовувати у властивостях: - Чиселиний - Булевий @@ -56,13 +56,13 @@ Cypher - це мова запитів Neo4j для спрощення робот Це *зв'язок* з *ярликом* **KNOWS**. Це такий же самий *ярлик* як і у вершини. Починається з великої літери та використовує ВЕРХНІЙ\_РЕГІСТР\_ІЗ\_ЗМІЇНОЮ\_НОТАЦІЄЮ. `[k:KNOWS]` -Те же самий *зв'язок*, до якого можна звертатись через змінну **k**. Можна подалі використовувати у запиті, хоч це і не обов'язково. +Це той же самий *зв'язок*, до якого можна звертатись через змінну **k**. Можна подалі використовувати у запиті, хоч це і не обов'язково. `[k:KNOWS {since:2017}]` -Те й же *зв'язок*, але вже із *властивостями* (як у *вершини*), в данному випадку властивіть - це **since**. +Той же *зв'язок*, але вже із *властивостями* (як у *вершини*), в данному випадку властивість - це **since**. `[k:KNOWS*..4]` -Це стуктурна інформація, яку використовують *шляхи*, які розглянуті нижче. В данному випадку, **\*..4** говорить: "Сумістити шаблон із зв'язком **k**, що повторюватиметься від одного до чотирьох разів." +Це структурна інформація, яку використовують *шляхи*, які розглянуті нижче. В данному випадку, **\*..4** говорить: "Сумістити шаблон із зв'язком **k**, що повторюватиметься від одного до чотирьох разів." Шляхи @@ -82,7 +82,7 @@ Cypher - це мова запитів Neo4j для спрощення робот `(a:Person)-[:MANAGES]->(b:Person)-[:MANAGES]->(c:Person)` Ланцюг, аналогічно, також може бути направленим. Шлях описує, що **a** - бос **b** і супер бос для **c**. -Шаблони, які часто викоритовуються (з документації Neo4j): +Шаблони, які часто використовуються (з документації Neo4j): ``` // Друг-мого-друга @@ -131,25 +131,25 @@ MATCH (a:Person) RETURN a ``` -Знайти вершини за ярликом та властивостю: +Знайти вершини за ярликом та властивістю: ``` MATCH (a:Person {name:"Théo Gauchoux"}) RETURN a ``` -Знайти вершини відовідно до зв'язків (ненаправлених): +Знайти вершини відповідно до зв'язків (ненаправлених): ``` MATCH (a)-[:KNOWS]-(b) RETURN a,b ``` -Знайти вершини відовідно до зв'язків (направлених): +Знайти вершини відповідно до зв'язків (направлених): ``` MATCH (a)-[:MANAGES]->(b) RETURN a,b ``` -Знайти вершини зо допомогою `WHERE`: +Знайти вершини за допомогою `WHERE`: ``` MATCH (p:Person {name:"Théo Gauchoux"})-[s:LIVES_IN]->(city:City) WHERE s.since = 2015 @@ -181,7 +181,7 @@ WHERE p.name = "Théo Gauchoux" SET p = {name: "Michel", age: 23} ``` -Додати нову властивіть до вершини: +Додати нову властивіcть до вершини: ``` MATCH (p:Person) WHERE p.name = "Théo Gauchoux" @@ -199,7 +199,7 @@ SET p:Internship Запити на видалення --- -Зидалити окрему вершину (пов'язані ребра повинні бути видалені перед цим): +Видалити окрему вершину (пов'язані ребра повинні бути видалені перед цим): ``` MATCH (p:Person)-[relationship]-() WHERE p.name = "Théo Gauchoux" @@ -250,5 +250,5 @@ DELETE n, r - У мові Cypher існують лише однорядкові коментарі, що позначаються двійним слешем : // Коментар - Можна виконати скрипт Cypher, збережений у файлі **.cql** прямо в Neo4j (прямо як імпорт). Проте, не можна мати мати кілька виразів в цьому файлі (розділених **;**). -- Використовуйте команднйи рядок Neo4j для написання запитів Cypher, це легко і швидко. +- Використовуйте командний рядок Neo4j для написання запитів Cypher, це легко і швидко. - Cypher планує бути стандартною мовою запитів для всіх графових баз даних (більш відома як **OpenCypher**). -- cgit v1.2.3 From 368870f4cd82afebb6637ca27dfd4eeb5fd89d7e Mon Sep 17 00:00:00 2001 From: AstiaSun Date: Thu, 31 Oct 2019 22:09:34 +0200 Subject: remove mistakes in words according to the review --- uk-ua/kotlin-ua.html.markdown | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) (limited to 'uk-ua') diff --git a/uk-ua/kotlin-ua.html.markdown b/uk-ua/kotlin-ua.html.markdown index 01c507eb..5e79cc48 100644 --- a/uk-ua/kotlin-ua.html.markdown +++ b/uk-ua/kotlin-ua.html.markdown @@ -1,14 +1,15 @@ --- language: kotlin +filename: LearnKotlin-uk.kt +lang: uk-ua contributors: - ["S Webber", "https://github.com/s-webber"] translators: - - ["AstiaSun", "https://github.com/AstiaSun"] -filename: LearnKotlin-uk.kt -lang: uk-ua + - ["AstiaSun", "https://github.com/AstiaSun"] --- -Kotlin - це мова програмування зі статичною типізацією для JVM, Android та браузера. Вона має 100% сумісність із Java. +Kotlin - це мова програмування зі статичною типізацією для JVM, Android та браузера. +Вона має 100% сумісність із Java. [Детальніше](https://kotlinlang.org/) @@ -120,7 +121,7 @@ fun helloWorld(val name : String) { println(odd(6)) // => false println(odd(7)) // => true - // Якщо значення, що повертається функцією, може бути однозначно визначено, + // Якщо тип значення, що повертається функцією, може бути однозначно визначено, // його непотрібно вказувати. fun even(x: Int) = x % 2 == 0 println(even(6)) // => true @@ -156,7 +157,7 @@ fun helloWorld(val name : String) { } } /* - Щоб створити новий об'єкт, потрібно викликали конструктор класу. + Щоб створити новий об'єкт, потрібно викликати конструктор класу. Зазначте, що в Kotlin немає ключового слова new. */ val fooExampleClass = ExampleClass(7) @@ -180,17 +181,17 @@ fun helloWorld(val name : String) { val fooCopy = fooData.copy(y = 100) println(fooCopy) // => DataClassExample(x=1, y=100, z=4) - // Об'єкти можуть бути знищенні кількома способами. + // Об'єкти можуть бути деструктурувані кількома способами. val (a, b, c) = fooCopy println("$a $b $c") // => 1 100 4 - // знищення у циклі for + // деструктурування у циклі for for ((a, b, c) in listOf(fooData)) { println("$a $b $c") // => 1 100 4 } val mapData = mapOf("a" to 1, "b" to 2) - // Map.Entry також знищується + // Map.Entry також деструктурувуються for ((key, value) in mapData) { println("$key -> $value") } @@ -206,14 +207,14 @@ fun helloWorld(val name : String) { println(fooMutableData) // => MutableDataClassExample(x=5, y=6, z=8) /* - Стисок можна створити використовуючи функцію listOf. + Список можна створити використовуючи функцію listOf. Список буде незмінним, тобто елементи не можна буде додавати або видаляти. */ val fooList = listOf("a", "b", "c") println(fooList.size) // => 3 println(fooList.first()) // => a println(fooList.last()) // => c - // доступ до елементів злійснюється через їх порядковий номер. + // доступ до елементів здійснюється через їхні порядковий номер. println(fooList[1]) // => b // Змінні списки можна створити використовуючи функцію mutableListOf. @@ -229,18 +230,18 @@ fun helloWorld(val name : String) { // mapOf створює асоціативний масив. val fooMap = mapOf("a" to 8, "b" to 7, "c" to 9) - // Доступ до значень в асоціативних масивах здійснюється через їх ключі. + // Доступ до значень в асоціативних масивах здійснюється через їхні ключі. println(fooMap["a"]) // => 8 /* - Послідовності представленні як колекції лінивих обчислень. Функція generateSequence + Послідовності представлені як колекції лінивих обчислень. Функція generateSequence створює послідовність. */ val fooSequence = generateSequence(1, { it + 1 }) val x = fooSequence.take(10).toList() println(x) // => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - // Приклад використання послідовностей, генерація чисел Фібоначі: + // Приклад використання послідовностей, генерація чисел Фібоначчі: fun fibonacciSequence(): Sequence { var a = 0L var b = 1L @@ -288,7 +289,7 @@ fun helloWorld(val name : String) { val message = if (num % 2 == 0) "even" else "odd" println("$num is $message") // => 5 is odd - // "when" використовується як альтернатива в ланцюзі "if-else if". + // "when" використовується як альтернатива ланцюгам "if-else if". val i = 10 when { i < 7 -> println("first block") -- cgit v1.2.3