User Tools

Site Tools


Sidebar


Здравствуйте!

Меня зовут Михаил!
Я системный администратор
и наполняю эту wiki,
решая разнообразные IT-задачки.

Моя специализация - виртуализация!

Я всегда готов помочь Вам
наладить IT-инфраструктуру
за скромное вознаграждение!

mike@autosys.tk
+7 (910) 911-96-23

rubyonrails:синтаксис-ruby

Объекты и методы

Ruby - объектно ориентированный язык, поэтому всё что угодно в нем объект с каким-то набором методов. То есть число - это объект с методами, которые возвращают его тип:

5.class
=> Fixnum # вызов метода '''class''' возвращает название класса объекта. В данном случае - '''Fixnum'''

"Ruby".reverse
=> "ybuR" # вызов метода '''reverse''' объекта типа '''string''' возвращает строку с обратным порядком символов

Есть символические методы: * + и другие.
При этом для объектов разных типов они работают по-разному.

Для строк они работают так:

"Ruby" * 5
=> "RubyRubyRubyRubyRuby"

"Hello" + "Ruby" 
=> "HelloRuby"

А для чисел так:

5 + 6
=> 11

Повторное использование имен методов

Очень! Очень важно понимать, что в Ruby принято повторное использование имен методов. Это означает, что для выполнения схожих функций (например - определения длинны) для разных классов могут использоваться методы с одинаковым именем.

Например - метод с именем length определен и для строк:

a = "Ruby"
a.length
=> 4

И для массивов:

a = [1, 2, 3, 5, 6, 7]
=> [1, 2, 3, 5, 6, 7]
a.length
=> 6

И для хешей (таблиц key-value):

sites = {}
sites["http://habrahabr.ru"] = :very_good
=> :very_good
sites["http://facebook.com"] = :not_bad
=> :not_bad
sites["http://odnoklassniki.ru"] = :bad
=> :bad

sites.length
=> 3

Однако это совершенно разные методы, определенные в разных классах с одним именем и схожим функционалом. Это круто!

Преобразование типов объектов

Иногда может понадобится преобразование типов объектов.
Методы преобразования типов:

.to_i - в число
.to_s - в строку
.to_a - в массив

Массивы

Массивы это упорядоченные списки значений.
Массив объявляется с помощью квадратных скобок в которых указаны элементы через запятую:

[12, 47, 35] 

К ним также применяются методы:

[12, 47, 35].max
=> 47 # метод .max вернул элемент массива с максимальным значением.

Массивы конечно можно сохранять в переменные:

numbers = [12, 47, 35]

И уже к переменным применять методы:

numbers.max
=> 47

Виды методов. Мутирующие и немутирующие

Метод может как возвращать новый объект, так и изменять тот объект к которому он применен. Эти способы неравнозначны с точки зрения потребления памяти. Изменение исходного объекта требует меньше памяти, чем создание нового.
Методы, названия которых оканчиваются восклицательным знаком ! - называются мутаторы, то есть они изменяют исходный объект.
Пример:

numbers = [12, 47, 35] # - делаем массив чисел
=> [12, 47, 35]

# применяем метод НЕмутирующий:
numbers.sort
=> [12, 35, 47]

# проверяем что не смутировало:
numbers
=> [12, 47, 35]

# применяем метод мутирующий:
numbers.sort!
=> [12, 35, 47]

# проверяем что смутировало:
numbers
=> [12, 35, 47]

Замена последовательности символов в строке

Это очень часто встречающаяся конструкция.

string = "My toast has flown from my hand"
=> "My toast has flown from my hand"

string['toast'] = 'beef'
=> "beef"

string
=> "My beef has flown from my hand"

Конструкция

stringname['_pattern_'] = 'new_pattern'

указывает что в стоке stringname нужно найти _pattern_ и заменить его на new_pattern.
Причем заменен будет только первый найденный pattern.

Хеши - hashes

Хеши - это таблицы соответствий ключей и значений (key - value).
Объявляются так:

sites = {}

Например можно создать рейтинг сайтов:

:very_good - очень хороший сайт
:good - просто хороший сайт
:not_bad - неплохой сайт
:bad - плохой сайт

Теперь можно прописать сайты и их рейтинги:

sites["http://habrahabr.ru"] = :very_good
sites["http://facebook.com"] = :not_bad
sites["http://odnoklassniki.ru"] = :bad

В дальнейшем, для того чтобы узнать какой же сайт нужно выполнить:

sites["http://habrahabr.ru"] # используем тоже самое выражение, только без присваивания
=> :very_good

Узнать количество строк таблицы хеша можно применив метод length:

sites.length
=> 3

С помощью еще одного хеша можно посчитать сколько каких оценок выставлено:

rates = Hash.new(0) # создаем обнуленный хеш
sites.values.each { |rate| rates[rate] += 1 } # берем каждое значения хеша sites,  назначаем его ключем хеша rates и каждый раз когда оно встречается делаем +1 к значению ключа

Теперь можно поглядеть как посчиталось количество оценок:

rates
=> {:very_good=>1, :not_bad=>1, :bad=>1}

Блоки кода

Блок - это строка кода, следующая после вызова метода, заключенная в фигурные скобки - {}, либо если код не помещается в одну строку, то вместо {} используется пара do … end. Блок всегда привязан к методу.
Блоки используются для организации циклов методами итераторами и перечислителями - times, each и другими.

Вот простейший цикл:

5.times { print "Ruby! " }
Ruby! Ruby! Ruby! Ruby! Ruby! => 5

Равнозначно:

5.times do 
print "Ruby! "
end

На каждом проходе, в блок кода метод .times передает текущее значение счетчика итераций. Для использования значений передаваемых в блок кода нужно применить конвейер (примерно как в bash):

5.times { |xxx| print "Ruby! " + xxx.to_s + "\n"}
Ruby! 0
Ruby! 1
Ruby! 2
Ruby! 3
Ruby! 4
=> 5

Тут в блоке кода переменная xxx принимает от метода .times значение счетчика и дальше в блоке кода мы используем эту переменную для вывода значений счетчика в строке.

Работа с файлами

Код

Dir.entries "/"

возвращает массив, элементами которого являются имена файлов и директорий указанной в кавычках директории. В данном случае - корневой.
Можно получить список файлов и папок текущей директории:

Dir.entries "./"

В windows в качестве директории можно передавать имя диска:

Dir.entries "d:"

Получить список файлов по маске:

Dir["/*.tx­t"]

или в windows:

Dir["d:\*.jpg"]

Читаем файл и выводим содержимое:

print File.­read("/com­ics.txt")

Копируем файл:

FileUtils.cp('/comics.txt', '/Home/comics.txt')

Открываем файл для того чтобы туда записать дополнительные строки в конец:

File.open("/test.txt", "a") do |f|
f << "test"
end
=> #<File:/test.txt (closed)>

Причем, как видно, Ruby самостоятельно закрывает файл при завершении операции с ним.

Дату последнего изменения файла возвращает метод File.mtime:

File.mtime("/ruby200/test.rbw")
=> 2013-11-01 10:58:46 +0400

Данный метод возвращает объект класса Time.

Определение новых методов

Нижеприведенная конструкция определяет новый метод:

def method_name( arg1, arg2 )

....

end

Discussion

Enter your comment. Wiki syntax is allowed:
W N M R P
 
rubyonrails/синтаксис-ruby.txt · Last modified: 2015/04/09 14:08 (external edit)