Заставить цикл Ruby возвращать изображения "x", а не x, целое число - PullRequest
1 голос
/ 30 октября 2009

Следующее возвращает любое целое число, которое я передаю как параметр.

  def space(spacer_count)
    spacer_count.times do
      image_tag("24gray/spacer.png", :class => "spacer")
    end
  end

Как заставить его вернуть нужное количество изображений? Например, я хочу, чтобы space (6) возвратил шесть копий spacer.png, а не число "6".

Спасибо!

Ответы [ 3 ]

4 голосов
/ 30 октября 2009

Если вы хотите вернуть единственную строку, содержащую все теги <img>, вы можете сделать следующее:

def space(spacer_count)
  image_tag("24gray/spacer.png", :class => "spacer") * spacer_count    
end
2 голосов
/ 30 октября 2009

Здесь уже есть несколько хороших ответов, поэтому я не собираюсь давать другой. Тем не менее, это может помочь понять, что здесь происходит не так. Каждый блок в Ruby возвращает оценку своего последнего оператора.

Метод times возвращает количество выполненных блоков. Каждый метод возвращает массив, на котором был запущен блок.

Видишь здесь образец? Большинство из этих методов итератора возвращают то, что было ему передано.

Блоки передаются вызывающей функции почти как аргумент. По сути, это то, что происходит в вашем коде.

block = Proc.new {  image_tag("24gray/spacer.png", :class => "spacer")}

def space(spacer_count)
    spacer_count.times(&block)
end

Теперь, зная, что итераторы возвращают то, что ему было передано, вы можете понять, почему space (6) возвращает 6

2 голосов
/ 30 октября 2009

Если вы используете 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
...