diff options
Diffstat (limited to 'ru-ru')
-rw-r--r-- | ru-ru/ruby-ru.html.markdown | 99 |
1 files changed, 84 insertions, 15 deletions
diff --git a/ru-ru/ruby-ru.html.markdown b/ru-ru/ruby-ru.html.markdown index ead681ef..318e0e09 100644 --- a/ru-ru/ruby-ru.html.markdown +++ b/ru-ru/ruby-ru.html.markdown @@ -43,7 +43,7 @@ translators: # Логические величины -- это объекты nil # Здесь ничего нет -true # правда +true # истина false # ложь nil.class #=> NilClass @@ -79,7 +79,8 @@ false.class #=> FalseClass placeholder = "использовать интерполяцию строк" "Я могу #{placeholder}, когда создаю строку с двойными кавычками" -#=> "Я могу использовать интерполяцию строк, когда создаю строку с двойными кавычками" +#=> "Я могу использовать интерполяцию строк, +# когда создаю строку с двойными кавычками" # печатать в стандартный вывод @@ -107,10 +108,10 @@ path = '/bad/name/' # Идентификаторы (тоже объекты) # Идентификаторы -- это неизменяемые, многоразовые константы. -# Для каждого идентификатора (кроме текста) сохраняется цифровой хэш. При последующем -# использовании идентификатора, заместо создания нового объекта, будет найден уже -# существующий по цифровому хэшу. Они часто используются вместо строк -# для ускорения работы приложений +# Для каждого идентификатора (кроме текста) сохраняется цифровой хэш. +# При последующем использовании идентификатора, заместо создания нового объекта, +# будет найден уже существующий по цифровому хэшу. +# Они часто используются вместо строк для ускорения работы приложений :pending.class #=> Symbol @@ -178,15 +179,15 @@ new_hash.keys #=> [:defcon, :action] # Управление ходом выполнения (Управляющие структуры) if true - "if условие" + "Если истина" elsif false - "else if, условие" + "Иначе, если ложь (опционально)" else - "else, условие" + "Во всех других случаях" end for counter in 1..5 - puts "#итерация {counter}" + puts "итерация #{counter}" end #=> итерация 1 #=> итерация 2 @@ -197,10 +198,11 @@ end # Однако, никто не использует "for" для циклов. # Вместо него Вы должны использовать метод "each" вместе с блоком кода. # -# Блок кода -- это один из вариантов создания замыканий (лямбды, анонимные функции). +# Блок кода -- это один из вариантов создания замыканий (лямбды, +# анонимные функции). # Блок может только передаваться методу, сам по себе он существовать не может. # "for" не имеет своей области видимости и все переменные, объявленные в нём -# будут доступны отовсюду. "each" вместе с блоком создаёт свою область видимости. +# будут доступны отовсюду. "each" вместе с блоком создаёт свою область видимости # Метод "each" для диапазона значений запускает блок кода один раз # для каждого из значений диапазона @@ -219,7 +221,7 @@ end # Вы также можете ограничивать блоки фигурными скобками: (1..5).each {|counter| puts "итерация #{counter}"} -# Содержимое управляющих структур также можно перебирать используя "each": +# Содержимое структурных данных также можно перебирать используя "each": array.each do |element| puts "#{element} -- часть массива" end @@ -350,10 +352,27 @@ dwight.name #=> "Dwight K. Schrute" # Вызов метода класса Human.say("Hi") #=> "Hi" -# Класс тоже объект в Ruby. Потому класс может иметь переменные экземпляра. +# Область видимости переменной определяется тем, как мы даём имя переменной. +# Переменные, имя которых начинается с "$" имеют глобальную область видимости +$var = "I'm a global var" +defined? $var #=> "global-variable" + +# Переменная экземпляра класса, она видна только в экземпляре +@var = "I'm an instance var" +defined? @var #=> "instance-variable" + +# Переменная класса, видна для всех экземпляров этого класса и в самом классе +@@var = "I'm a class var" +defined? @@var #=> "class variable" + +# Имена переменных с большой буквы используются для создания констант +Var = "I'm a constant" +defined? Var #=> "constant" + +# Класс тоже объект в Ruby. Класс может иметь переменные экземпляра. # Переменная класса доступна в классе, его экземплярах и его потомках. -# Базовый класс +# Пример класса class Human @@foo = 0 @@ -396,4 +415,54 @@ end Human.bar # 0 Doctor.bar # nil +module ModuleExample + def foo + 'foo' + end +end + +# Включение модулей в класс добавляет их методы в экземпляр класса +# Или в сам класс, зависит только от метода подключения +class Person + include ModuleExample +end + +class Book + extend ModuleExample +end + +Person.foo # => NoMethodError: undefined method `foo' for Person:Class +Person.new.foo # => 'foo' +Book.foo # => 'foo' +Book.new.foo # => NoMethodError: undefined method `foo' + +# Коллбэки при подключении модуля + +module ConcernExample + def self.included(base) + base.extend(ClassMethods) + base.send(:include, InstanceMethods) + end + + module ClassMethods + def bar + 'bar' + end + end + + module InstanceMethods + def qux + 'qux' + end + end +end + +class Something + include ConcernExample +end + +Something.bar # => 'bar' +Something.qux # => NoMethodError: undefined method `qux' +Something.new.bar # => NoMethodError: undefined method `bar' +Something.new.qux # => 'qux' ``` |