Заставить цикл Ruby возвращать изображения «x», а не x, целое число

StackOverflow https://stackoverflow.com/questions/1649735

  •  22-07-2019
  •  | 
  •  

Вопрос

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

  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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top