Модификаторы переменных
без модификатора - видима в текущем блоке и в подблоках
$ - глобальная
@ - переменная класса
@@ - статическая переменная класса
Первая буква заглавная - константа или имя класса
Массивы
Нумерация массивов начинается с нулевого элемента. Отрицательный индекс - обратная нумерация. В отличие от PHP, массив - это последовательность из N элементов. Поэтому если a = [1, 2] и задается значение a[4] = 10, то в результате получаем массив [1, 2, nil, nil, 10].
Создать массив
a = []
a = Array.new
a = ["asdf", "g", "h", "jkl;"]
Новый массив из фразы
a = %w{Ruby is a best language}
a = "Ruby is a best language".split(" ")
Выбрать часть массива
a = [1, 2, 3, 4, 5]
a[2, 2] # [3, 4]
a[1..3] # [2, 3, 4]
a[1...3] # [2, 3]
Изменить массив
a = [1, 2, 3, 4, 5]
a[1,2] = [] # a = [1, 4, 5]
a[0,1] = 3 # a = [3, 4, 5]
a[0,1] = [1, 2, 3] # a = [1, 2, 3, 4, 5]
Полезные методы
a.length # длина массива
a.shift # "вынуть" (вернуть и удалить) первый элемент
a.pop # "вынуть" последний элемент
Хеши (ассоциативные массивы)
Создать хеш
h = {'hash' => '{}', 'array' => '[]'}
h['hash'] = "{'key' => 'value'}"
Найти элемент по условию
р.find { |item| item.name == 'hash' }
Регулярные выражения
Создать выражение
r = Regexp.new('/a(b)c/')
r = /a(b)c/
r = %r{a(b)c}
Применить выражение в условии
str = "Ruby is OOP language"
puts $1 if str =~ /(OOP)/
puts str unless str !~ /OOP/
Специальные переменные
$1..$9 - найденые группы $& - текст, найденый по шаблону $` - текст до шаблона $' - текст после шаблона
Использование объекта вместо специальных переменных
m = /(a)(b)(c)/.match('abcdefg')
m[0] > $&
m[1] > $1
...
m.pre_match > $`
m.post_match > $'
Callbacks
yield
def doSomething
yield
end
doSomething { puts "It is a something :-)" }
def doSomethingWithParams
yield 1
end
doSomethingWithParams do
|i| puts "It is a something with #{i} :-)"
end
Определить, что методу передан callback
if block_given?
yield
end
Блоки кода как объекты
def doSomething(&callback)
callback.call
end
doSomething { print "This is a something" }
def doSomething(callback)
callback.call
end
doSomething proc { print "This is a something" }
Разименовать блок кода для yield-применения
p = proc {|i| print i}
(1..10).each &p
Ввод/Вывод
puts - выводит строку print - выводит строку без \n в конце printf - аналогичен C printf gets - помещает результат ввода строки данных в переменную $_ и возвращает строку
Методы
Значение по умолчанию для параметра
def myMethod(value = "Default")
Все или часть параметров поместить в массив
def myMethod(*args)
Во время вызова метода использовать разбиение массива на параметры
myMethod(*[1, 2])
Вызов метода с использованием именованых параметров
myMethod('param2' => 1, 'param1' => 2)
Классы
конструктор
def initialize
создание объекта
MyClass.new
клонирование объекта
myClass.dup
"заморозка" (нельзя изменять не "разморозив") объекта
myClass.freeze
dump объекта
myClass.inspect
cтроковый идентификатор объекта
myClass.to_s
вызов аналогичного метода parent класса
super
задание readonly свойств/аттрибутов
attr_reader :documentUri
задание writeonly свойств
def documentUri=(documentUri)
@documentUri = documentUri
end
Задание static переменной класса
@@users
Задание static метода класса
class Page
def Page.addHit
@@hit += 1
end
end
Модификаторы области видимости
[public|protected|private]
def ...
def ...
или
private :myMethod1, :myMethod2
Модификатор области видимости для унаследованного метода
private_class_method: new
Переопределение операций
class NodeList
def +(newNode)
# ...
end
end
Исключения
begin
# ...
rescue ExceptionClass
# ...
rescue ExceptionClass => e
# ...
ensure
# ...
end
аналогичен Java коду:
try {
// ...
} catch (ExceptionClass) {
// ...
} catch (ExceptionClass e) {
// ...
} finaly {
// ...
}
Получить Exception объект в секции rescure
$!
Вызывать исключение
raise
Повторно вызвать begin .. end блок
retry
Прерывание выполнения
catch (:exit) do
1..10.each do |i|
1..10.each do |j|
throw :exit if a[i, j] = 0
end
end
end
Модули
Определить модуль
module MyFunctions
def ...
end
Добавить описания из модуля в класс
class MyClass
include MyFunctions
end
Прочее
Взаимодействие с shell
`date`
Альясы операторов
class Fixnum
alias oldPlus +
def +(value)
oldPlus(value)
puts 'Plus called'
end
end
Параллельное присвоение
a, b = b, a
Небольшой пример программы на Ruby
Написав этот мини курс я попробовал составить к нему оглавление. Примерно оценив количество заголовков я пришел к выводу, что вручную это будет очень непродуктивно - проще написать небольшую программу на Ruby, которая составляет оглавление из заголовков и заменяет строку CREATE_TOC на созданное оглавление
File: createToc.rb
#!/usr/bin/ruby -w
# createToc.rb
# Программа составляет оглавление, выводит его вместо CREATE_TOC
# и добавляет якоря вида <a name="sN"></a> к заголовкам
# задаем строковую переменную - идентификатор оглавления
tocToken = 'CREATE_TOC'
# определяем массив, в котором будет строиться оглавление
toc = []
# результат
output = ''
# для всех строк входного потока
ARGF.each do |line|
# если строка содержит заголовок 3го, 4го или 5го уровня
if line =~ %r{<h([3-5])>([^<]+)</h[3-5]>}
# определить номер якоря
anchorId = toc.length.to_s
# и добавить в массив toc пункт оглавления
toc << (' ' * ($1.to_i - 3) * 2) + "<a href=\"#a#{anchorId}\">#{$2}</a><br>\n"
# к строке output добавить заголовок с добавленым якорем
output << line.sub('>', "><a name=\"a#{anchorId}\"></a>")
else
output << line
end
end
# выводим результат, в котором tocToken заменяется на оглавление
puts output.sub(tocToken, '<div class="TOC">' + toc.join + '</div>')
К сожалению, эта программа не учитывает, что оглавление и якоря могут уже быть добавлены. Если добавите такую возможность к программе, присылайте патч.
Использование программы:
$ createToc.rb < article.html > new_article.html