Заставить цикл Ruby возвращать изображения «x», а не x, целое число
Вопрос
Следующее возвращает любое целое число, которое я передаю в качестве параметра.
def space(spacer_count)
spacer_count.times do
image_tag("24gray/spacer.png", :class => "spacer")
end
end
Как мне заставить его возвращать желаемое количество изображений?Например, я хочу, чтобы space(6) возвращал шесть копий spacer.png, а не число «6».
Спасибо!
Решение
Если вы хотите вернуть одну строку, содержащую все <img>
теги, то вы можете сделать следующее:
def space(spacer_count)
image_tag("24gray/spacer.png", :class => "spacer") * spacer_count
end
Другие советы
Если вы используете Ruby 1.8.7 или новее
def space(spacer_count)
spacer_count.times.map do
image_tag("24gray/spacer.png", :class => "spacer")
end
end
В Ruby 1.8.6 вам следует использовать обходной путь (он также работает с версией 1.8.7 и выше).Первый обходной путь.
def space(spacer_count)
Array.new(spacer_count).map do
image_tag("24gray/spacer.png", :class => "spacer")
end
end
Второй обходной путь (с использованием диапазонов).
def space(spacer_count)
(1..spacer_count).map do
image_tag("24gray/spacer.png", :class => "spacer")
end
end
Здесь уже есть несколько хороших ответов, поэтому я не собираюсь давать еще один.Однако это может помочь понять, что здесь не так.Каждый блок в Ruby возвращает оценку своего последнего оператора.
Метод times возвращает количество запусков блоков.Методeach возвращает массив, в котором был запущен блок.
Видите здесь закономерность?Большинство этих методов-итераторов возвращают то, что было ему передано.
Блоки передаются вызывающей функции почти как аргумент.По сути, это то, что происходит в вашем коде.
block = Proc.new { image_tag("24gray/spacer.png", :class => "spacer")}
def space(spacer_count)
spacer_count.times(&block)
end
Зная теперь, что итераторы возвращают то, что им было передано, вы можете понять, почему space(6) возвращает 6.