2009-10-30 51 views
1

以下内容返回作为参数提供它的任何整数。使Ruby循环返回“x”图像而不是x,整数

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

如何让它返回所需数量的图像?例如,我希望空间(6)返回spacer.png的六个副本,而不是数字“6”。

谢谢!

回答

4

如果你想返回一个包含所有<img>标签一个字符串,那么你就可以做到以下几点:

def space(spacer_count) 
    image_tag("24gray/spacer.png", :class => "spacer") * spacer_count  
end 
+0

尼斯之一!在这种情况下,我从未考虑过使用*的想法。 – 2009-10-30 17:45:39

+0

干杯。锻炼了魅力。 :-) – 2009-10-31 07:03:36

2

如果使用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 
2

有一些很好的答案已经在这里,所以我不打算再给一个。但是,这可能有助于了解这里出了什么问题。 Ruby中的每个块返回对最后一条语句的评估。

times方法返回块运行的次数。 每个方法都会返回块在其上运行的数组。

在这里看到一个模式?大多数这些迭代器方法返回传递给它的内容。

块几乎就像参数一样传递给调用函数。基本上这就是你的代码中发生的事情。

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

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

现在知道了迭代器返回的内容传递给它,你可以看到为什么空间(6)返回6

+0

感谢您的解释。 – 2009-10-31 07:04:28

+0

没问题。我相信,在了解根本原因方面,不仅仅是了解解决问题的方法,而且在防止问题方面还有很长的路要走。 – EmFi 2009-10-31 07:27:08