Upload
-
View
200
Download
0
Embed Size (px)
Citation preview
#3 Обзор RubyОбзор языка
и начало работы над своим приложением
Денис Калесников, главный программист Мэйк
make.st
Особенности Ruby
Интерпретируемый язык с динамической типизацией. Это значит, что для
вызова методов не обязательно задавать типы атрибутов. Все
переменные в общем равноправны. Вы сами определяете, с чем вы
работаете.
Не имеет точки входа.
Не требует компиляции, т.е. выполняется в момент запроса. Но в
следствии этого работает несколько медленнее.
Позволяет писать лаконичные выражения, за счет богатой встроенной
библиотеки.
Переменные в Ruby
Локальная переменная: variable_name
Переменная экземпляра класса: @variable_name
Переменная класса: @@variable_name.
Глобальная переменная: $VARIABLE_NAME.
Важно! Не рекомендуется использовать глобальные переменные, потому
что они могут быть изменены в любой точке программы.
Основные типы данных
String - строковый: “строка”
Integer - целые числа: 4
Float - числа с плавающей запятой: 4.5
Symbol - символ: :symbol
Классы, модули и методы
Определение класса начинается с ключевого слова class и названия самого
класса, которое пишется CamelCase’ом
Модули задаются как классы, только слово module используется вместо
class. В отличие от классов создать объекты на основе модуля нельзя,
модуль не может иметь подклассы, нет иерархии и наследования.
Классы и модули содержат в себе методы, которые объявляются
конструкцией def method_name … end и бывают нескольких типов: public,
private, protected
Наследование и примеси (mixins)
Наследование позволяет разным классам соотноситься друг с другом и
группироваться по схожим частям в структуре.
Примеси (mixins) - возможность модулей делить функциональность между
классами. При включении (include) модуля в класс, его методы также
добавляются в класс.
Методы в Ruby
Несколько фактов о методах:
Названия пишутся в стиле camel_case
Могут быть определены в любом
контексте.
Могут оканчиваться на ? или на !
Последнее выражение является
возвращаемым значением.
Пример:
def method_name(arg1, arg2=1, params={})
arg1 + arg2 + params[:a]
end
Управляющие конструкции
Классический вариант:
if a<b
…
elsif a==b
...
else
...
end
Одностроковый (inline) вариант:
puts a if a > b
a > b ? puts a : puts b
Управляющие конструкции
unless является управляющей конструкцией, обратной конструкции if.
unless
…
end
Важно! Использовать в данной конструкции else не рекомендуется, так как
блоки становятся тяжелыми для восприятия.
Операторы
Операторы языка достаточно стандартны. Большинство операторов руби по
факту являются вызовами соответствующих методов. Например a + b
интерпретируется как a. + (b), где метод “+” вызывается на объект, на
который ссылается переменная a с аргументом b.
Наиболее удобную таблицу прецедентности операторов для языка Ruby
можно найти здесь:
www.tutorialspoint.com/ruby/ruby_operators.htm
Обработка исключений
Чтобы избежать ошибок в работе приложения, часто используют обработчик
исключений. Для этого используют блок:
begin
rescue Exception => e
…
ensure
end
Если появляется исключение, то контроль передается блоку rescue и
исполняется код внутри этого блока. Код внутри ensure исполняется всегда
Массивы
Массив создаётся как минимум тремя способами.
1. [1, 2, 3, 4]
2. Array.new(6){ |index| index + 1 }
3. (1..6).to_a
Массивы. Действия с массивами
Размер массива можно получить с помощью метода size:
[1, 3, ‘ruby’, 16].size #=> 4
Сортировка выполняется с помощью методов sort или sort_by:
[1, 5, 3, 2, 16].sort #=> [1, 2, 3, 5, 16]
["собака", "была", "у", "артемия"].sort_by{ |elem| elem.size }
#=>["у", "была", "собака", "артемия"]
Массивы. Действия с массивами
Для того, чтобы обратить массив, достаточно использовать метод reverse:
[1, 2, 3, 4, 5].reverse #=>[5, 4, 3, 2, 1]
Группировка массивов производится с помощью метода group_by:
%w(машина волк заяц сова шрек кот ток бит).group_by{|el| el.size }
#=> {6=>["машина"], 4=>["волк", "заяц", "сова", "шрек"], 3=>["кот", "ток", "бит"]}
Массивы. Действия с массивами
Для удаления элемента из массива существует метод delete. Особенностью
этого метода является то, что он возвращает удаленное значение.
Пример:
array = [1, 5, 3, 2, 16, 2] #=> [1, 5, 3, 2, 16, 2]
a = 2 #=> 2
array.delete(a) #=> 2
array #=> [1, 5, 3, 16]
Если вам необходимо очистить массив от nil элементов, используйте метод
compact
Хэши
Хэш (hash) - коллекция пар ключ-значение. Хэш подобен массиву, за
исключением того, что индексация осуществляется через ключи (объекты
любого типа), а не через целочисленные индексы.
Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}
Hash[:a => 100, "b" => 200] #=> {"a"=>100, "b"=>200}
{ "a" => 100, "b" => 200 } #=> {"a"=>100, "b"=>200}
Hash[a: 100, b: 200] #=> {:a=>100, :b=>200}
{String => 'string', Integer => 'int', a: 12}
Хэши
Метод delete(key) удаляет пару ключ-значение из хеш, которая соответствует
ключу key.
Возвращается значение, соответствующее ключу. Если ключ не был найден,
тогда возвращается "значение по-умолчанию". Если используется
конструкция с блоком и ключ не был найден, то возвращается результат
выполнения блока block, которому передается ключ key
h = { "a" => 100, "b" => 200 } #=> {"a"=>100, "b"=>200}
h.delete("a") #=> 100
h.delete("z") #=> nil
h.delete("z") { |el| "#{el} не найден" } #=> "z не найден"
Хэши
HashWithIndifferentAccess
Позволяет получать значения по ключу независимо от того какой типа его
ключ - String или Symbol (символ)
Удобно использовать когда названия ключей заданы в коде символом, а хэш
приходит из запроса или текстового файла.
Важно! Не входит в стандартную библиотеку и предоставляется
фреймворком Rails
Блоки
Блок — это произвольный код, который можно передать любому методу в
качестве неявного последнего аргумента. Следует понимать, что при этом
блок является особой конструкцией языка и обособлен от списка явных
аргументов метода, что означает следующее:
методу можно передать только один блок;
он всегда идет в самом конце и вынесен за скобки с аргументами (если
они есть);
его можно задать при вызове любого метода, независимо от того, указаны
в определении метода аргументы или нет.
Блоки. Замыкание контекста
Блок имеет доступ к переменным и контексту где вызывается метод, в
который передается этот блок.
Это похоже на замыкание - прием в программировании, когда функция
захватывает переменные контекста, в котором она определена.
Циклы
Классические циклы for …; while …; until …; в rails-приложениях почти не
используются. Синтаксис у них стандартный.
Так же есть циклы do … while; do … until:
begin
...
end while …
Прервать цикл - вызов break
На следующую итерацию - next
Циклы. Часто используемые конструкции
Чтобы создать обычный цикл, исполняющийся n раз в Ruby, достаточно
использовать следующую конструкцию:
n.times do
…
end
times в Ruby заменяет код вида for(i=0;i<n;i++), но это не означает, что цикл
for отсутствует в Ruby.
Циклы. Часто используемые конструкции
Для того чтобы разобрать массив или коллекцию по элементам существует 2
метода - each и each_with_index. Метод each_with_index используется, когда
необходимо хранить индекс текущего цикла.
Пример:
collection.each do |collection_item|
...
end
collection.all.each_with_index do |collection_item, index|
...
end
Циклы. Часто используемые конструкции
В отличии от метода each, метод map возвращает массив элементов.
array.map {|item| block }
Выполняет выражение block для каждого элемента массива array. Создает и
возвращает новый массив, состоящий из значений, которые получены при
вычислении выражения block. Исходный массив при этом не изменяется
Циклы. Часто используемые конструкции
Метод reduce позволяет свести коллекцию значений в одно. Для каждого
значения в коллекции вызывается функция, первый аргумент которой
результат предыдущего вычисления, второй - текущий элемент коллекции.
Важно! Метод обрабатывает коллекцию слева-направо.
Конкатенация строк. Интерполяция
Строка создаётся при помощи ограничительных символов. Для этих целей
чаще всего используются " (программистская кавычка) и ' (машинописный
апостроф). Их смысл различен:
Строка в апострофах гарантирует, что в ней будет содержаться тот же
текст, что и в коде программы, без изменений.
Строка в кавычках будет проходить предварительное преобразование.
Будут раскрыты конструкции «вставка» и «специальный символ».
Вставка — это конструкция, которая вставляется между ограничительными
символами внутри строки. Например: "Hello, #{User.name}!"
Конкатенация строк. Безопасный вывод HTML
При использовании шаблонизатора erb, у вас появится возможность
выводить данные из Ruby на страницу.
Для того, чтобы безопасно вывести данные, необходимо использовать
конструкцию <%= content %>. Она выведет все данные как текст.
По умолчанию код HTML преобразуется в текст и пользователь видит
непосредственно HTML-код. Это связано с защитой от XSS-атак.
Если вы уверены в авторе HTML-содержимого и хотите, чтобы браузер
интерпретировал как HTML, вы можете использовать
<%= content.html_safe %> либо <%== content %>
Литература
https://habrahabr.ru/hub/ruby/
https://github.com/bbatsov/ruby-style-guide
https://github.com/bbatsov/rails-style-guide
http://rusrails.ru/