Ако погледнем по-отблизо нашата нова програма, ще забележим, че присъства ред, който започва с #. В Ruby всичко, което започва с # е коментар и не се интерпретира. Конкретно в нашия пример се ползва специален случай, който показва как да бъде стартиран файла под UNIX-подобни операционни системи.
Въведохме известна промяна в метода say_hi
:
# Say hi to everybody
def say_hi
if @names.nil?
puts "..."
elsif @names.respond_to?("each")
# @names is a list of some kind, iterate!
@names.each do |name|
puts "Hello #{name}!"
end
else
puts "Hello #{@names}!"
end
end
В горния пример правим проверка на параметъра @names
за да вземем
решение. Ако е nil, отпечатваме три точки.
Цикли, познати като итерации
Ако обектът @names
отговаря на each
, би следвало да можем да минем
през всеки един от неговите елементи и да отпечатаме неговата стойност.
Ако това не стане, просто превръщаме обекта в низ и отпечатваме
стандартния поздрав.
Нека разгледаме итератора от близо:
@names.each do |name|
puts "Hello #{name}!"
end
Методът each
приема блок с код, който се изпълнява за всеки елемент от
списъка, бит по бит, между ключовите думи do
и end. Блокът е като
анонимната функция @lambda
. Променливата между вертикалните черти е
параметъра за този блок.
В повечето езици за програмиране се ползва цикъл като for
за обхождане
на списъка, като това става на C по следния начин:
for (i=0; i<number_of_elements; i++)
{
do_something_with(element[i]);
}
Този вариант работи, но не е най-елегантното решение. Имаме нужда от
променлива i, големината на списъка и описание на начина на обхождане. В
Ruby това става много елегантно, като всички детайли са скрити в метода
each
. Вътрешната реализация на този метод просто извиква yield
"Albert"
, след това yield "Brenda"
и накрая yield "Charles"
Блокът, блясъкът на Ruby
Истинската мощ на блоковете може да видим в обработката на сложни списъци.
# Say bye to everybody
def say_bye
if @names.nil?
puts "..."
elsif @names.respond_to?("join")
# Join the list elements with commas
puts "Goodbye #{@names.join(", ")}. Come back soon!"
else
puts "Goodbye #{@names}. Come back soon!"
end
end
Методът say_bye
не използва each
, а вместо това прави проверка дали
@names
отговаря на метода join
и при положителен резултат го ползва.
При отрицателен резултат просто отпечатва променливата като низ. Този
метод не се интересува от типа на променливата, а се уповава на
методите, на които отговаря, като това е познато като “Duck Typing” –
“ако ходи като патица и кряка като патица, би трябвало да е патица”. По
този начин не сме ограничени от типа на променливите. Ако някой друг
напише подобен клас, единственото нещо, което трябва да присъства е
имплементацията на метода join
за да може всичко да работи правилно.
Стартиране на скрипта
Ползваме един последен трик за стартиране на скрипта:
if __FILE__ == $0
__FILE__
е специална променлива, която съдържа името на настоящия
файл, а $0
представлява името на файла, нужен за стартирането на
програмата. Тази проверка има следното значение: “Ако това е главния
изпълним файл …”. Това ни позволява да ползваме скрипта като
библиотека.
Вместо край на ръководството
Тук приключва краткото въведение в Ruby. Надяваме се това да Ви е запалило да научите и използвате този прекрасен език. Ако това е така, можете да прегледате раздела Документация , където ще намерите връзки към напълно безплатни самоучители и ръководства.