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)には、「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

2番目の回避策(範囲を使用)。

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

ここにはすでにいくつかの良い答えがありますので、別の答えはしません。ただし、ここで何が間違っているのかを理解するのに役立つ場合があります。 Rubyのすべてのブロックは、最後のステートメントの評価を返します。

timesメソッドは、ブロックが実行された回数を返します。 各メソッドは、ブロックが実行された配列を返します。

ここにパターンがありますか?これらのイテレータメソッドのほとんどは、渡されたものを返します。

ブロックは、ほぼ引数のように呼び出し元の関数に渡されます。基本的に、これはあなたのコードで起こっていることです。

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