Ruby за 5 минут

Ruby - очень простой в освоении язык и в то же время довольно мощный инструмент для решения повседневных и прикладных задач. Наличие модулей под API многих платформ позволяет использовать его как универсальное решение многих проблем автоматизации.
Создан Якихиро Мацумото (Matz), mid-1990. Programmer-oriented language.

Ruby - мультипарадигменный:

  • скриптинг
  • ООП
  • Императивный
  • Функциональный (итераторы)

Установка

http://ruby-lang.org/en/downloads/

Win - Ruby Installer
Lin - apt-get install ruby
Mac - предустановлен

http://rubyinstaller.org/

Консоль

> irb
a = 1+2
a.to_s
=> "3"
a
=> 3
a.class
=> Fixnum
quit()

Скрипты

> cat helloworld.rb
puts("Hello world")
> ruby helloworld.rb
Hello world
> helloworld.rb
Hello world
> ruby -e 'puts "Hello World!"'

Синтаксис

Вывод в консоль

irb> puts("String", "String2") // new line
irb> puts "String", "String2" // the same
irb> print ("Hello world") // without new line
irb> print "Hello\n world" // with new line
irb> puts(2+2)
irb> print(2+2)

Ввод из консоли

irb> name = gets // with \n
Name
=> "Name\n"
irb> name.chomp
"Name"
irb> Integer(num) // to int
irb> Float(num) // to float

Упражнение:

"Input your name"
name = gets
"Hello" + name

Объектно-ориентированное программирование

Да, сразу

class MyClass # имя класса
    @boo
    def my_method # метод
        @foo = 2    # @ - переменная экземпляра
    end
end

// Ex.:
> mc = MyClass.new  # экземпляр
> mc.my_method      # =>2
> mc.boo            # error

Внимательный читатель видит, что доступ возможен только к методам класса. Что же делать?

def boo         # getter
    return @boo
end
def boo=(val)   # setter
    @boo = val
end

Или

attr_accessor :boo

return писать не обязательно, последнее выходное значение функция и вернет:

def min(x,y)
    if x < y then x else y end
end

скобки при вызове опциональны.

Соглашения о нотациях:

self.cls_method - метод класса (не объект, статический метод)
Array.new - метод класса

method? => boolean
method! => меняет объект

single inheritance
классы можно дополнять

class Fixnum
    def previous
        return self-1
    end
end

Строки

'' - просто строка
"" - string interpolation (#{var}) `` - команда

name = "Oleg Sidorkin"
name.length
name[6]
name[6..14]
"Mr " + name
name.encoding
name[2..-1]
name = gets.chomp
name = "Oleg\tSidorkin"
print name
"Oleg\sSidorkin"
"Oleg's"
'Oleg's' => nil
'Oleg\'s'

words = <<HERE
some
poem
   with 
        text
.
HERE

name, surname = "Oleg.Sidorkin     ".split(/./)     => array
удалить пробелы
string.squeeze

Регулярные выражения

regular ex: /pattern/modifiers (perl)
=~ - return position

"Homer" =~ /er/ # => 3

phone.gsub!(/\D/, "") - replace nondigit

Символы

:sym = "Value" # error
puts :name.object_id    # only one
puts "name".object_id   # many differrent objects

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

В руби все - выражение, все возвращает значение, даже if

if expression1
    ...
[elsif expression2
    ...
else
    ...]
end

code if expression

expr ? true : false

==, !=, =~, !~, ===

until expression
    code
end

for var in collection do
    body
end

while condition do
    body
end

until condition do
    body
end

Collections, Blocks, Iterations

Array, Hash, Set

Enumerable module provides iterator each

# Ex from RoR
def index
    @posts = Post.all   # Array
end

Array

a = [33.3, "hi", 2]     # nonhomogenious
a[0]

huge number of methods.

> Array.methods
=> sort, include?, reverse, length, first, last, <<, push, pop, etc..

Hash

phone = {:home => 1, :mobile => 2, :work => 3} # could be 'home'
phone[:home]
phone.key(1)
phone.key?(:home)
phone.value?(1)

Hashes and arrays can be nested

Block

Block - multiple lines of code as a parameter

def three_times
    yield
    yield
    yield
end
three_times(puts "Hello world")

Iterators

from RoR

def each
    for each item in the collection
        yield(item)
    end
end
array.each {|element| puts element}

@posts.each do |post|
    ...
end
Яндекс.Метрика