30
#3 Обзор Ruby Обзор языка и начало работы над своим приложением Денис Калесников, главный программист Мэйк make.st

Обзор Ruby

  • 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 не рекомендуется, так как

блоки становятся тяжелыми для восприятия.

Управляющие конструкции

case a

when a < 5

when a == 5

else

end

Операторы

Операторы языка достаточно стандартны. Большинство операторов руби по

факту являются вызовами соответствующих методов. Например 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/

Спасибо за внимание!

Денис Калесников, главный программист Мэйк

make.st