Читать «Учись программировать (на Ruby)» онлайн - страница 45

Крис Пайн

А почему же она называется «киркомотыга» («the pickaxe»)? Ну, там на обложке книги есть картинка киркомотыги. Мне кажется, это глупое название, но оно уже «прилипло».

Ruby–Talk: список рассылки о Ruby

Tim Toady

То, от чего я старался уберечь вас, но с чем вы непременно скоро столкнётесь, это принцип TMTOWTDI (произносится «Тим Тоуди») или «There's More Than One Way To Do It», что значит «Есть не один способ сделать что-либо».

В то время как одни будут говорить вам, какая замечательная вещь этот TMTOWTDI, другие относятся к нему совсем по-другому. На самом деле, у меня в основном не возникает по этому поводу никаких сильных эмоций, но я считаю, что это ужасный метод обучить кого-то, как нужно программировать. (Как будто научить делать что-то одним способом это само по себе не достаточно трудоёмкое и сложное дело!)

Однако теперь, когда вы выходите за рамки того учебника, вы будете читать гораздо более разнообразные программы. Например, мне приходят на ум по крайней мере пять различных способов создания строки (помимо заключения некоторого текста в одинарные кавычки), и каждый из них работает немного по-другому. Я показал вам только самый простой из этих шести.

А когда мы говорили о ветвлении, я показал вам if, но не показал unless. Предоставляю вам выяснить что это такое в irb.

Ещё одно приятное сокращение, которое вы можете использовать для if, unless и while, это симпатичная однострочная версия:

# Эти слова взяты из программы, которую я написал для генерирования

# англоподобной болтовни. Круто, да?

puts 'grobably combergearl kitatently thememberate' if 5 == 2**2 + 1**1

puts 'enlestrationshifter supposine follutify blace' unless 'Chris'.length

= = 5

grobably combergearl kitatently thememberate

И наконец, есть ещё один способ писать методы, которые принимают блоки (а не процедурные объекты). Мы видели это, когда мы захватывали блок и превращали его в процедурный объект, используя трюк с &block в списке параметров при определении функции. Тогда, чтобы вызвать блок, вы просто используете block.call. Ладно, есть способ покороче (хотя лично я нахожу его более запутанным). Вместо этого:

def doItTwice(&block) block.call block.call end

doltTwice do

puts 'murditivent flavitemphan siresent litics' end

murditivent

n a h p m e t i v a l f

siresent

litics

murditivent

flavitemphan

siresent

litics

…вы делаете так:

def doltTwice yield yield end

doltTwice do

puts 'buritiate mustripe lablic acticise' end

buritiate

mustripe

lablic

acticise

buritiate

mustripe

lablic

acticise

Ну, не знаю… а что вы об этом думаете? Возможно, так только я так считаю, но… yield?! Если бы это было что-нибудь наподобие call_the_hidden_block или что-то в этом роде, что бы имело немного больше смысла для меня. Многие люди говорят, что yield для них имеет смысл. Но я думаю, что принцип TMTOWTDI предполагает вот что: они делают что-то по-своему, а я делаю это по-моему.

КОНЕЦ

Используйте всё это во благо, а не во зло. :-) И если вы находите этот учебник полезным (или запутанным, либо если вы нашли ошибку),<a href="mailto:[email protected]"> дайте мне знать!