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