Блог

Ruby: Быстрое знакомство

Мое знакомство с Ruby. Возможно кому-то пригодится, когда будет начинать его учить. Краткая информация.

Массив – Это упорядоченная последовательность индексированных значений, начинается с нуля.

pacific = ['Washington', 'Oregon', 'California']

Хэш – это таблица ключей к значениям.

pacific = {'wa'=>'Washington', 'or'=>'Oregon', 'ca'=>'California'}

Методы
Методы обеспечивают средства сбора кода в одном месте, так чтобы воспользоваться им было легко и при необходимости многократно. Вот описание метода с именем hello, созданное с помощью ключевых слов def и end:

def hello
    puts "Hello World!"
end

Сделать метод неопределенным.

undef hello

Определить методы, у которых есть параметры:

def hello(name)
    puts "Hello, "+ name
end

Возвращаемые значения
В Ruby возращается поледниее значение метода с явно заданым оператором return или без него.

irb(main):001:0> def hello
irb(main):002:1>    "Hello World"
irb(main):003:1> end
=> nil
irb(main):004:0> hello
=> "Hello World"
irb(main):005:0> puts hello
Hello World
=> nil
irb(main):006:0> def hello
irb(main):007:1>    return "Hello"
irb(main):008:1> end
=> nil
irb(main):009:0> hello
=> "Hello"

Соглашение о присвоении имен методам
В Ruby имеются соглашения о последнем символе в именах методов. Соглашения, которые широко используются, но языком не навязываются:
– знак (?) – метод возвращает булево значение (true/false)

x = 1.0
x.eql?

– знак (!) – метод указывает на то, что метод является “разрушительным”.

name = "Matz!"
puts name.delete("!")
puts name.delete!("!")

– знак (=) – это метод “setter” (сеттер), который осуществляет присваивание или устанавливает переменняю, такую как переменная экземпляра класса в классе

irb(main):001:0> class Name
irb(main):002:1>     def name=(name)
irb(main):003:2>         @name = name
irb(main):004:2>     end
irb(main):005:1>
irb(main):006:1* end
=> nil
irb(main):007:0> n = Name.new
=> #<Name:0xb7351c10>
irb(main):008:0> n.name= 'Matz'
=> "Matz"
irb(main):009:0> n
=> #<Name:0xb7351c10 @name="Matz">

Параметры по умолчанию

def repeta(str = 'Hello!', rep = 3)
    puts str * rep
end

Переменное число параметров
если не известно, сколько параметров будет у метода. можно передать переченное число параметров, если задать префикс в виде звездочки (*).

def n_args( *args )
    len = args.size
    label = len == 1 ? 'argument':'arguments'
    num = len.to_s + label +'('+ args.inspect +')'
    num
end

puts n_args
puts n_args 1
puts n_args(1, 2, 'three')

Переменные параметры можно устанавливать наряду с обычными параметрами.

def num(number, *args)
    puts number
    puts args.inspect
end

Псевдонимы методов
Ключевое слово alias, которое создает альтернативные имена методов – псевдонимы. Назначение псевдонима означает, что вы, в сущности, создаете копию метода с новым именем метода, несмотря на то, что оба вызова методов будут указывать на один и тот же объект.

irb(main):001:0> def greet
irb(main):002:1>     puts "Hello!"
irb(main):003:1> end
=> nil
irb(main):004:0> alias hello greet    # Присваиваем альтернативное имя
=> nil
irb(main):005:0> greet                # Вызов метода
Hello!
=> nil
irb(main):006:0> hello                # Вызов по альтерному имени
Hello!
=> nil
irb(main):007:0> greet.object_id      # идентификатор объекта
Hello!
=> 4
irb(main):008:0> hello.object_id      # на какой объект ссылается псевдоним?
Hello!
=> 4

Блоки
В ruby часто является идиоматическим выражением для извлечения всех значений из структры данных путем выполнения итераций над этой структурой, он что-то вроде “дай мне все, что у тебя там есть, по одной штуке за раз”.

pacific = ['Washington', 'Oregon', 'California']
pacific.each do |item|
    puts item
end

Можно заменить do/end парой фигурных скобок, чтобы получить более компактную запись (! – фигурные скобки имееют более высокий приоритет, чем do/end).

 pacific.each { |item| puts item }

Оператор yield
Работа yield состоит в том, чтобы выполнять блок кода, связанный с методом.

def gimme
    if block_given?
        yield
    else
        puts 'I`m blockless!'
    end
end

gimee { print "Say hi to the people"}
gimee

Процедурные объекты (procs)
В ruby позволительно сохранять процедуры – или проки (procs), в виде объектов, в комплекте вместе со своим контекстом. Можно сделать это несколькими способами. Один из них состоит в вызове метода new для класса Proc другой заключается в вызове методов lambda или proc из Kernel (вызов lambda или proc предпочтительнее по сравнению с Proc, потому что lamba и proc выполняют проверку параметров)

#!/usr/bin/env ruby
count = Proc.new {[1,2,3,4,5].each do |i| print i end; puts }
proc = lambda { puts "Lurch: 'You rang?'" }
proc2 = proc { puts "Morticia: `who was at the door, Lurch?`" }

#Какой тип объектов вы только что создали?
puts count.class, proc.class, proc2.class

#Вызов всех "проков"
count.call
proc.call
proc2.call

Вы можете также на лету преобразовать связанный с ним блок в proc. Для это необходимо создать для метода параметр которому предшествует амперсанта (&).

#!/usr/bin/env ruby
def _block
    yield
end

def _proc(&proc)
    yield
end

_block {puts "Got block!"}
_proc  {puts "Got block, convert to proc!" }

У метода _proc, есть один параметр, имя которого начинается с амперсанта (&), он примет блок и преобразует его в объект класса Proc. С yield в теле метода выполняет блок и ему не приходится заботиться о методе call из Proc.

Символы
В ruby есть специальный объект под название символ (symbol). Они являются “заполнителями” для идентификаторов и строк. Вы всегда можете распознать их по предшесвующему двоеточию (:).

irb(main):001:0> hw = "Hello, World"
=> "Hello, World"
irb(main):002:0> :"Hello, World".id2name
=> "Hello, World"
irb(main):003:0> hw == :"Hello, World".id2name
=> true
irb(main):004:0>

Обработка исключений

begin
    # Код, в котором может возникнуть ошибка…
rescue
    # Обработка исключений,
else
    # Прочие исключения…
ensure
    # Этот код выполняется в любом случае,
end

 

Cсылка:
http://ruby-doc.org/
http://www.ruby-lang.org/en/documentation/quickstart/
http://tryruby.org/levels/2/challenges/2

Книга:
Майкл Фитцджеральд – Изучаем Ruby: 2008