Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ruby / Быстрый курс Ruby.doc
Скачиваний:
113
Добавлен:
06.06.2015
Размер:
147.46 Кб
Скачать

Модификаторы переменных

без модификатора - видима в текущем блоке и в подблоках

$ - глобальная

@ - переменная класса

@@ - статическая переменная класса

Первая буква заглавная - константа или имя класса

Массивы

Нумерация массивов начинается с нулевого элемента. Отрицательный индекс - обратная нумерация. В отличие от 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

Соседние файлы в папке Ruby