В этой капле мы еще раз пробежимся по всем рассмотренным нами темам и углубимся в них в поисках упущенного и интересного.
Внимание! Это последняя капля, опубликованная в блоге Ruby! Все прошлые (1, 2, 3, 4, 5, 6) уже сидят в новом блоге Стартап «Программист». Блог предназначен для начинающих и, возможно, «матёрых» программистов, желающих выучить шаг за шагом первый или… цатый язык программирования. Теперь следить за каплями еще проще!
Легко продемонстрировать это с помощью метода
Восклицательный знак в конце метода означает, что он не только возвращает результат, но и изменяет объект, к которому он применен (это так называемый «опасный» метод). Метод
Методы с вопросительным знаком, так называемые предикаты, возвращают только
Метод
Порой создание массива из слов может быть большой головной болью, однако в Руби есть упрощение для этого:
Мы уже говорили о том, что выражения условий позволяют контролировать направления выполнения кода. Повторим эти выражения и узнаем новые.
Но Руби не был бы Руби, если б не упрощал нам задачу. Полностью аналогичный цикл:
Пример условия:
Конструкция
Как обычно цикл можно поместить в одну строку:
В коде
В этом примере
Асоциативные массивы (далее хэши, hashes) похожи на массивы, так как они также содаржат упорядоченный набор объектов. Однако в массиве объекты индексируются числами, а в хэше индексом может быть любой объект. Простой пример:
Как видим элементы хэша не упорядочиваются, поэтому хэши непригодны для списков, очередей и т.д.
Везде, где вы хотите поставить строку в кавычках, задумайтесь о применении
Еще небольшая и интересная порция данных, необходимая для нашего дальнейшего развития в Руби. Комментарии приветствуются!
Внимание! Это последняя капля, опубликованная в блоге Ruby! Все прошлые (1, 2, 3, 4, 5, 6) уже сидят в новом блоге Стартап «Программист». Блог предназначен для начинающих и, возможно, «матёрых» программистов, желающих выучить шаг за шагом первый или… цатый язык программирования. Теперь следить за каплями еще проще!
Ввод и inspect
puts "What is your name?"
STDOUT.flush
chompname = gets.chomp
puts "Again, what is your name?"
name = gets
puts "Hello, " + name
puts "Hi, " + chompname
puts 'But name = ' + name.inspect + ' and chompname = ' + chompname.inspect
STDOUT
— стандартная глобальная константа, обозначающая стандартный канал вывода. Метод flush
очищает все данные во внутреннем буфере ввода/вывода Руби. Использование этой строки кода необязательно, но рекомендуется. Помним, что все константы должны начинаться с заглавной буквы.gets
принимает одну строку введенных данных и передает его переменной. chomp
— это метод класса String
. Несмотря на то, что результат мы видим одинаковый, необходимо помнить, что gets
возвращает строку и \n
, в то время как chomp
удаляет этот \n
(метод также удаляет возврат каретки \r
и комбинацию \r\n
).Легко продемонстрировать это с помощью метода
inspect
, роль которого «заглядывать» в переменные, классы — в общем в любые объекты Руби.Пунктуация в методах
Восклицательный знак в конце метода означает, что он не только возвращает результат, но и изменяет объект, к которому он применен (это так называемый «опасный» метод). Метод
strip
убирает пробелы в конце строки:string = 'Bring, bring '
a = string.strip!
puts string
puts a
Методы с вопросительным знаком, так называемые предикаты, возвращают только
true
или false
, например, метод массивов empty?
вернет true, если если в массиве нет элементов:a = []
puts "empty" if a.empty?
Метод
any?
наоборот вернет true
, если в массиве элементы присутствуют, а nonzero?
, определенный в классе Numeric
, выдаст nil
, если число, на которое он вызван, равно нулю, в противном случае вернет это число.Используем %w
Порой создание массива из слов может быть большой головной болью, однако в Руби есть упрощение для этого:
%w{}
делает то, что нам нужно:pets1 = [ 'cat', 'dog', 'snake', 'hamster', 'rat' ]
pets2 = %w{ cat dog snake hamster rat } # pets1 = pets2
Ветвление по условиям
Мы уже говорили о том, что выражения условий позволяют контролировать направления выполнения кода. Повторим эти выражения и узнаем новые.
if
a = 7
if a == 4
a = 9
end
Но Руби не был бы Руби, если б не упрощал нам задачу. Полностью аналогичный цикл:
a = 7
a = 9 if a == 4
if-elsif-else
Пример условия:
a = 7
if a == 4
a = 9
else
if a == 7
a = 10
end
end
elsif
максимально упростит это условие и получаем:a = 7
if a == 4
a = 9
elsif a == 7
a = 10
end
Трёхместный оператор
a = 7
plus_minus = '+'
print "#{a} #{plus_minus} 2 = " + (plus_minus == '+' ? (a+2).to_s : (a-2).to_s)
Конструкция
[? (expr) : (expr)]
называется трёхместным (ternary) оператором (единственный трехместный в Руби) и служит для подсчета выражения и возвращения результата. Рекомендуется использовать только для второстепенных задач, так как подобный код тяжело воспринимается. Подсчитывается сначала первый операнд перед ?
, если его значение не false
и не nil
, значением выражения становится значение второго операнда, иначе — третьего (после :
).while
while
в Руби синтаксически похож на if
и while
в других ЯП:a = 0
while a < 5
puts a.to_s
a += 1
end
Как обычно цикл можно поместить в одну строку:
<...код...> while <выражение>
Символы (Symbols)
В коде
Symbol
выглядит как имя переменной, только начинающееся с :
, например, :action. Symbol
— самый простой объект в Руби, который возможно создать — у него есть только имя и ID
. Symbol'ы более эфективны, производительны, чем строки, — данное имя для symbol ссылается на один объект на протяжении всей программы, в то время как две строки с одинаковым содержанием являются разными объектами — это сохраняет время и память:ruby_know = :yes
if ruby_know == :yes
puts "You're a good guy!"
else
puts 'Learn Ruby!'
end
В этом примере
:yes
— symbol
, он не содержит значений или объектов, вместо этого он используется как постоянное имя в коде. Мы можем преспокойно заменить :yes
на строку "yes"
, результат будет такой же, но программа будет менее производительной. Более подробно о теме вы можете узнать в замечательной статье от Kane «Различие между символами и строками»Ассоциативные массивы
Асоциативные массивы (далее хэши, hashes) похожи на массивы, так как они также содаржат упорядоченный набор объектов. Однако в массиве объекты индексируются числами, а в хэше индексом может быть любой объект. Простой пример:
h = {'dog' => 'sobaka', 'cat' => 'koshka', 'donkey' => 'oslik'}
puts h.length # 3
puts h['dog'] # 'sobaka'
puts h # catkoshkadonkeyoslikdogsobaka
Как видим элементы хэша не упорядочиваются, поэтому хэши непригодны для списков, очередей и т.д.
Везде, где вы хотите поставить строку в кавычках, задумайтесь о применении
symbol
:users = Hash.new
users[:nickname] = 'MaxElc'
users[:language] = 'Russian'
puts users[:nickname] #MaxElc
Эпилог
Еще небольшая и интересная порция данных, необходимая для нашего дальнейшего развития в Руби. Комментарии приветствуются!