From f6b94b84af3f1d626dfcc04cb39803186a31bc99 Mon Sep 17 00:00:00 2001 From: Andrei Shirobokov Date: Tue, 2 Jun 2015 14:23:39 +0400 Subject: [PATCH 01/10] fix curried functions example for russian lang --- ru/basics.html | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/ru/basics.html b/ru/basics.html index 8817f721..36cf3930 100644 --- a/ru/basics.html +++ b/ru/basics.html @@ -218,8 +218,14 @@

Каррирование функций

Вы можете взять любую функцию с множеством аргументов и произвести ее каррирование. Давайте попробуем использовать функцию, которую рассматривали раньше, например adder

-scala> (adder _).curried
-res1: (Int) => (Int) => Int = <function1>
+scala> val curriedAdd = (adder _).curried
+curriedAdd: Int => (Int => Int) = <function1>
+
+scala> val addTwo = curriedAdd(2)
+addTwo: Int => Int = <function1>
+
+scala> addTwo(4)
+res22: Int = 6
 

См. подробнее о Каррировании

Использование переменного количества аргументов

From 23e628b842746236dfac983d05bd51936bbcda32 Mon Sep 17 00:00:00 2001 From: Andrei Shirobokov Date: Tue, 2 Jun 2015 14:51:02 +0400 Subject: [PATCH 02/10] Fix example for "Variable length arguments" section --- ru/basics.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ru/basics.html b/ru/basics.html index 36cf3930..b4ad4cdb 100644 --- a/ru/basics.html +++ b/ru/basics.html @@ -236,6 +236,9 @@

Использование переменного количества ар arg.capitalize } } + +scala> capitalizeAll("rarity", "applejack") +res2: Seq[String] = ArrayBuffer(Rarity, Applejack)

Классы


From 5eebc27748cedadf5cbeeda49a617b825113b88b Mon Sep 17 00:00:00 2001
From: Andrei Shirobokov 
Date: Tue, 9 Jun 2015 10:17:53 +0400
Subject: [PATCH 03/10] Add "Aside: Functions vs Methods" sections

Add "Aside: Functions vs Methods" sections for russian language
---
 ru/basics.html | 37 +++++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/ru/basics.html b/ru/basics.html
index b4ad4cdb..c118267b 100644
--- a/ru/basics.html
+++ b/ru/basics.html
@@ -281,6 +281,43 @@ 

Конструктор

Обратите внимание на два различных способа написания комментариев.

Выражения

Наш пример с калькулятором дает хороший пример того, как Scala ориентирован на выражения (expression-oriented). Значение переменной color было присвоено благодаря if/else выражению. Scala сильно ориентирован на выражения: большинство вещей делается с помощью выражений, а не утверждений.

+ +

Функции и методы

+

+ Функции и методы в основном взаимозаменяемы. Потому что функции и методы на столько похожи, что вам нет нужды знать что именно вы вызываете - функцию или метод. + Когда вы столкнетесь с различиями в функциях и методах вы будете удивлены. +

+
+	scala> class C {
+     |   var acc = 0
+     |   def minc = { acc += 1 }
+     |   val finc = { () => acc += 1 }
+     | }
+defined class C
+
+scala> val c = new C
+c: C = C@1af1bd6
+
+scala> c.minc // calls c.minc()
+
+scala> c.finc // returns the function as a value:
+res2: () => Unit = 
+
+ +

+ В то время, как вы вызываете одну "функцию" без скобок, а другую - со скобками, вы можете подумать: + Упс, я думал, что знаю как работают функции в Scala, но, как оказалось, нет. Возможно, иногда им требуются скобки? + Вы можете понимать функции, но использовать методы. +

+ +

+ На практике, вы можете делать великие вещи на Scala не вдаваясь в подробности различия функций и методов. + Если вы новичок в Scala и прочитали + объяснение различий, + то, возможно у вас будут проблемы с ними. Это не значит, что у вас возникнут проблемы с использованием Scala. + Это только означает, что различия между функциями и методами достаточно тонкие, что их разъяснение могут погрузить вас в глубинные части языка. +

+

Наследование

 class ScientificCalculator(brand: String) extends Calculator(brand) {

From eff92738c9f6aba372f971ad8fa43e8651ae7f17 Mon Sep 17 00:00:00 2001
From: Andrei Shirobokov 
Date: Thu, 11 Jun 2015 16:58:27 +0400
Subject: [PATCH 04/10] "Abstract classes" for russian language

---
 ru/basics.html | 28 ++++++++++++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/ru/basics.html b/ru/basics.html
index c118267b..c66472d9 100644
--- a/ru/basics.html
+++ b/ru/basics.html
@@ -331,6 +331,34 @@ 

Перегрузка методов

def log(m: Int): Double = log(m, math.exp(1)) }
+ +

Абстрактные классы

+

+ Вы можете определять абстрактные классы. Абстракные классы определяют содержат методы, но не реализуют их. + Однако, подклассы, наследующиеся от абстрактного класса, содержат реализацию этих методов. + Создать экземпляр абстрактного класса запрещено. +

+ +
+	scala> abstract class Shape {
+     	|   def getArea():Int    // subclass should define this
+     	| }
+	defined class Shape
+	
+	scala> class Circle(r: Int) extends Shape {
+	     |   def getArea():Int = { r * r * 3 }
+	     | }
+	defined class Circle
+	
+	scala> val s = new Shape
+	<console>:8: error: class Shape is abstract; cannot be instantiated
+	       val s = new Shape
+	               ^
+	
+	scala> val c = new Circle(2)
+	c: Circle = Circle@65c0035b
+
+

Трейты

Трейты – это коллекция полей и методов, которые вы можете расширить или примешать к вашему классу.


From 75b06705a7cbcf256054fd0512af7cd6cf794718 Mon Sep 17 00:00:00 2001
From: Andrei Shirobokov 
Date: Wed, 24 Jun 2015 17:29:40 +0400
Subject: [PATCH 05/10] Traits and abstract classes

Section about differences between traits and abstract classes has been translated
---
 ru/basics.html | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/ru/basics.html b/ru/basics.html
index c66472d9..eefe6b77 100644
--- a/ru/basics.html
+++ b/ru/basics.html
@@ -373,6 +373,25 @@ 

Трейты

}

Смотрите также: В Effective Scala есть описание Трейтов.

+ +

+ В каких случаях требуется использовать трейты вместо абстрактных классов? + Если вы хотите создать тип похожий на интерфейс, то возможно вам покажется непростым занятием решить что использовать: + трейт или абстрактный класс. + Несколько правил для принятия решения: +

    +
  • Если вам необходимо расширять класс несколькими поведениями, то используйте трейты: класс может наследовать несколько трейтов, но только один класс
  • +
  • Если вам необходим конструктор с параметрами - используйте абстракные классы - трейты могут содержать только конструкторы без параметоров. + Например, trait t(i: Int) {}; параметр i в этом коде недопустим.
  • +
+

+ +

Вы не первый, кто задает такой вопрос. Более подробные ответы вы можете найти на +stackoverflow:Scala traits vs abstract classes, Difference between Abstract Class and Trait, +и +Programming in Scala: To trait, or not to trait? +

+

Типы

Ранее вы могли видеть, что мы определили функцию, принимающая тип Int, который является одним из видов Number. Функция может быть объявлена как обобщенная (generic) и после этого может работать с любым типом. Когда объявлена такая функция, вы увидите

параметр-тип
размещенный внутри квадратных скобок:
Вы можете думать о них, как о множестве параметров-типов. Рассмотрим пример трейта Кэш (Cache), который принимает параметры-типы (K, V) для ключей и их значений.

From 0c9efb936158088e858a9c5c45287ac0dc7c65ae Mon Sep 17 00:00:00 2001 From: Andrei Shirobokov Date: Tue, 30 Jun 2015 19:41:53 +0400 Subject: [PATCH 06/10] Fix section about types Fix translation and example for method has been added --- ru/basics.html | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/ru/basics.html b/ru/basics.html index eefe6b77..75fd70ec 100644 --- a/ru/basics.html +++ b/ru/basics.html @@ -393,8 +393,22 @@

Трейты

Типы

-

Ранее вы могли видеть, что мы определили функцию, принимающая тип Int, который является одним из видов Number. Функция может быть объявлена как обобщенная (generic) и после этого может работать с любым типом. Когда объявлена такая функция, вы увидите

параметр-тип
размещенный внутри квадратных скобок:
-Вы можете думать о них, как о множестве параметров-типов. Рассмотрим пример трейта Кэш (Cache), который принимает параметры-типы (K, V) для ключей и их значений.

+

+ Ранее вы могли видеть, что мы определили функцию, принимающая тип Int, который является одним из видов Number. + Функция может быть объявлена как обобщенная (generic) и после этого может работать с любым типом. Когда объявлена такая функция, вы увидите параметр-тип размещенный внутри квадратных скобок. + Трейт, описанный ниже, описывает кеш с параметрами-типами для ключа и значения этого кеша [K, V]: +

+	  trait Cache[K, V] {
+	    def get(key: K): V
+	    def put(key: K, value: V)
+	    def delete(key: K)
+	  }
+	
+ Методы так же могут иметь параметры-типы. +
+		def remove[K](key: K)
+	
+

 trait Cache[K, V] {
   def get(key: K): V

From 4cb2c664ce568e6defe6b4f7a05d959fc28d8ad4 Mon Sep 17 00:00:00 2001
From: Andrei Shirobokov 
Date: Tue, 30 Jun 2015 19:44:31 +0400
Subject: [PATCH 07/10] Remove redundant examples

---
 ru/basics.html | 11 -----------
 1 file changed, 11 deletions(-)

diff --git a/ru/basics.html b/ru/basics.html
index 75fd70ec..2a388d3e 100644
--- a/ru/basics.html
+++ b/ru/basics.html
@@ -409,17 +409,6 @@ 

Типы

def remove[K](key: K)

-
-trait Cache[K, V] {
-  def get(key: K): V
-  def put(key: K, value: V)
-  def delete(key: K)
-}
-
-

Методы тоже могут иметь параметры-типы

-
-def remove[K](key: K)
-
Здесь мы объявили класс Calculator +
 scala> val calc = new Calculator
 calc: Calculator = Calculator@e75a11
 

From 5de71329ba86d1a65b7985b2592691e3d5c173d4 Mon Sep 17 00:00:00 2001
From: Andrei Shirobokov 
Date: Wed, 1 Jul 2015 09:55:45 +0400
Subject: [PATCH 09/10] fix example for classes

---
 ru/basics.html | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/ru/basics.html b/ru/basics.html
index 327c0e9c..115b1a88 100644
--- a/ru/basics.html
+++ b/ru/basics.html
@@ -241,15 +241,13 @@ 

Использование переменного количества ар res2: Seq[String] = ArrayBuffer(Rarity, Applejack)

Классы

+Здесь мы объявили класс Calculator:
 scala> class Calculator {
      |   val brand: String = "HP"
      |   def add(m: Int, n: Int): Int = m + n
      | }
-
-Здесь мы объявили класс Calculator -
 scala> val calc = new Calculator
 calc: Calculator = Calculator@e75a11
 

From 8de8a3cf002b3b44e374ad8d500d20b7d526af17 Mon Sep 17 00:00:00 2001
From: Andrei Shirobokov 
Date: Wed, 1 Jul 2015 13:43:27 +0400
Subject: [PATCH 10/10] fix examples for apply method

---
 ru/basics2.html | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/ru/basics2.html b/ru/basics2.html
index b33d07df..76dd51c6 100644
--- a/ru/basics2.html
+++ b/ru/basics2.html
@@ -58,19 +58,28 @@ 

Основы языка. Продолжение

Метод apply

Метод apply – это синтаксический сахар, который применяется для класса или объекта с единственной целью.

-object FooMaker {
-  def apply() = new Foo
-}
+scala> class Foo {}
+defined class Foo
+
+scala> object FooMaker {
+     |   def apply() = new Foo
+     | }
+defined module FooMaker
 
-scala> class Bar {
+scala> val newFoo = FooMaker()
+newFoo: Foo = Foo@5b83f762
+
+

или

+
+	scala> class Bar {
      |   def apply() = 0
      | }
 defined class Bar
 
-scala> val bar = new Bar
+scala> val bar = new Bar
 bar: Bar = Bar@47711479
 
-scala> bar()
+scala> bar()
 res8: Int = 0
 

Здесь наш экземпляр объекта выглядит так, будто мы просто вызываем метод, но это не так. Подробнее об этом позже!