Pull to refresh

Покорим Ruby вместе! Капля седьмая

Reading time 4 min
Views 21K
В этой капле мы еще раз пробежимся по всем рассмотренным нами темам и углубимся в них в поисках упущенного и интересного.

Внимание! Это последняя капля, опубликованная в блоге 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


В этом примере :yessymbol, он не содержит значений или объектов, вместо этого он используется как постоянное имя в коде. Мы можем преспокойно заменить :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


Эпилог


Еще небольшая и интересная порция данных, необходимая для нашего дальнейшего развития в Руби. Комментарии приветствуются!
Tags:
Hubs:
+26
Comments 40
Comments Comments 40

Articles