【问题标题】:Make Ruby loop return "x" images rather than x, the integer使 Ruby 循环返回“x”图像而不是 x,整数
【发布时间】:2010-12-11 14:34:16
【问题描述】:

以下返回我作为参数提供的任何整数。

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

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

谢谢!

【问题讨论】:

    标签: ruby loops return


    【解决方案1】:

    如果您使用 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】:

      如果要返回包含所有<img> 标签的单个字符串,则可以执行以下操作:

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

      【讨论】:

      • 不错的一个!我从来没有考虑过在这种情况下使用 * 的想法。
      【解决方案3】:

      这里已经有一些很好的答案,所以我不会再给出一个。但是,这可能有助于理解这里出了什么问题。 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

      【讨论】:

      • 没问题。我相信了解根本原因比仅仅了解解决方法更有助于预防问题。
      猜你喜欢
      • 2020-09-02
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2016-03-23
      • 1970-01-01
      相关资源
      最近更新 更多