2020
Приложение на языке Ruby всегда выполняется с помощью интерпретатора, как во время разработки, так и во время использования конечными пользователями
new
, конструкторПеременные могут содержать в себе ссылки на объекты любых типов
Для выполнения приложения на языке Ruby потребуется:
Запуск приложения сводится к вызову интерпретатора Ruby с указанием файла, начинающего исполнение приложения
Актуальные интерпретаторы Ruby
Во всех операционных системах есть переменная окружения PATH, содержащая набор каталогов, в которых происходит поиск исполняемых файлов
Если каталога с исполняемым файлом нет в PATH, то для его запуска надо указать абсолютный путь
Вместе с обычным интерпретатором языка ruby
, предназначенным для выполнения приложений, поставляется также интерактивный интерпретатор irb
Данное приложение работает по следующему принципу:
IRB позволяет
Приложение «Музыкальный автомат» должно обрабатывать данные о песнях. Опишем структуру объектов типа «песня» с помощью класса Song
:
Создадим две переменные first_song
и second_song
, запишем в них ссылки на создаваемые объекты
Сообщение включает название метода и набор аргументов для него
Если метод не найден или количество аргументов не совпало, то будет выброшено исключение
Более детально логику поиска методов обсудим на следующих занятиях
При написании кода на языке Ruby вам всегда будут доступны:
Object
Kernel
puts
модуля Kernel
puts
выводит переданные аргументы на стандартный поток вывода
puts
выводит аргументы на стандартный поток вывода и добавляет перенос на следующую строкуprint
не добавляет перенос на новую строкуprintf
позволяет выводить информацию согласно формату, как в Сиp
выводит информацию в формате, пригодном для отладкиpp
выводит информацию для отладки сложных объектов, пригодной для восприятия разработчикомdef say_goodnight(name)
result = "Good night, " + name
return result
end
# Вызываем метод
puts say_goodnight("John-Boy")
puts say_goodnight("Mary-Ellen")
#
def
end
return
Обычно скобки опускаются только в самых простых случаях:
puts
, print
и p
)Также следует использовать соглашения конкретных библиотек
#{ ... }
Вместо конкатенации строк используйте шаблонные строки
return
return
обычно используется когда результат становится известен заранее:
Первый символ элемента приложения описывает его назначение
$
@
@@
?
, !
, =
a = [1, 'cat' , 3.14]
puts "Первый элемент #{a[0]}"
# Установим новое значение 3 элементу массива
a[2] = nil
puts "Массив сейчас #{a.inspect} "
nil
null
в Javanil
— объект, обозначающий отсутствие значенияa = ['ant' , 'bee' , 'cat' , 'dog' , 'elk']
a[0] # => "ant"
a[3] # => "dog"
# Создание такого же массива из строки
a = %w{ant bee cat dog elk}
a[0] # => "ant"
a[3] # => "dog"
=>
»: ключ =>
значениеinst_section = {
'cello' => 'string',
'clarinet' => 'woodwind',
'drum' => 'percussion'
}
print inst_section['cello']
nil
# Создаём массив со значением по умолчанию
histogram = Hash.new(0)
histogram['ruby'] # => 0
histogram['ruby'] = histogram['ruby'] + 1
histogram['ruby'] # => 1
Часто при написании приложения нам необходимо описать уникальные значения и обращаться к ним с помощью слов
Для решения этих задач можно прибегнуть либо к константам, либо к строкам
Проблемами использования констант являются:
Проблемой использования строк является то, что под каждую из них необходимо выделить отдельную память
В Ruby есть специальный тип данных Symbol
, который позволяет описать уникальное именованное значение
Символы создаются с помощью синтаксиса :north
или :"north"
Символы часто используются в качестве ключей хешей
Поддержка таких хешей добавлена в синтаксис языка
Ruby поддерживает знакомые вам конструкции
if
для описания условной логикиwhile
для описания циклических действийtoday = Time.now
if today.saturday?
puts "Do chores around the house"
elsif today.sunday?
puts "Relax"
else
puts "Go to work"
end
Блок описания заканчивается ключевым словом end
Любое выражение может являться условием. Ложными значениями являются только false
и nil
. Все остальные значения являются верными.
while weight < 100 && num_pallets <= 5
pallet = next_pallet()
weight += pallet.weight
num_pallets += 1
end
Метод gets
получает строку со стандартного потока ввода
При достижении конца потока gets
возвращает nil
Условные операторы могут выступать в роли модификатора выражения
if radiation > 3000
puts "Danger, Will Robinson"
end
puts "Danger, Will Robinson" if radiation > 3000
Аналогично для операторов цикла
square = 4
while square < 1000
square = square*square
end
square = square*square while square < 1000
Однако не стоит таким образом описывать сложные выражения
В Ruby также существует цикл for
, который позволяет выполнить действие для элемента коллекции
Однако для выполнения действий несколько раз удобнее воспользоваться методом times
у целых чисел:
/Perl|Python/
— либо строка целиком Perl
, либо целиком Python
/ab+c/
— a
, за которым следует несколько b
, затем c
~=
sub
строки позволяет заменять подстрокиline = "Perl and Python are scripting languages"
newline = line.sub(/Perl/, 'Ruby')
newerline = newline.gsub(/Python/, 'Ruby')
callbacks
{ puts "Hello" } # Для одного выражения
do # Для нескольких выражений
club.enroll(person)
person.socialize
end
Для ассоциации блока с методом его необходимо описать сразу после вызова метода
Вызов осуществляется с помощью ключевого слова yeild
def call_block
puts "Start of the method"
yield
puts "End of the method"
end
call_block { puts "In the block" }
def who_says_what
yield ("Dave", "hello")
yield ("Andy", "goodbye")
end
who_says_what do |person, phrase|
puts "#{person} says #{phrase}"
end
Итератором называется метод коллекций, принимающий блок
Под коллекцией понимаются как встроенные классы массива и хеша, так и классы, созданные пользователями
Коллекции поддерживают множество итераторов
animals = %w(ant bee cat dog)
animals.each { |animal| puts animal }
3.upto(6) { |number| print number }
('a'..'e').each { |character| print character }
data = [5, 66, 13, 24, 46]
# Все элементы с позицией
data.each_with_index do |number, index|
puts "#{index}: #{number}"
end
# Все ли элементы удовлетворяют условию: являются нечётными
data.all? { |number| number.odd? }
# Создать новый массив на основе текущего: квадраты чисел
data.map { |number| number**2 }
# Посчитать общую характеристику: сумму чисел
data.reduce { |memo, number| number + memo }
# Выбрать часть элементов массива
data.select { |number| number > 40 }
Массив ARGV
содержит список строк, которые были переданы в виде аргументов командной строки
Если приложение ориентировано на обработку текстовых файлов, то пути к ним можно передать в качестве аргументов
В приложении к ним можно обратиться как к одному большому файлу через специальный объект ARGF