Я бы написал это так, чтобы вы могли передать блок, который вызывает функцию или делает все, что вы хотите:
def gather
[].tap do |collection|
result=true; i=0
until result.nil?
unless (result=yield(i)).nil?
collection << result
end
i += 1
end
end
end
# Silly test
$letters = *('a'..'z')
$current = -1
def next_char(max)
$letters[$current+=1] if $current<max
end
some = gather{ next_char(10) }
p some
#=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]
some = gather{ |i| $letters[i] if i<=10 }
p some
#=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]
Обратите внимание, что вы можете написать метод следующим образом:
def gather
[].tap do |result|
x = true
result << x unless (x=yield).nil? until x.nil?
end
end
… но лично я не нахожу это очень читабельным.