如何将块映射到Ruby中的Enumerable?

时间:2013-06-22 01:35:23

标签: ruby enumerable

这是我正在尝试的事情

class Lorem

  def ipsum &block
    data = get_data
    data.each { |id| block.call dolor(id) } if block_given?
    data
  end

  def dolor id
    {dolor: id}
  end

  private

  def get_data
    [1, 2, 3] # some fake data
  end

end

stuff = []
panda = Lorem.new
panda.ipsum { |thing| stuff << thing }

puts stuff.inspect
# => [{dolor: 1}, {dolor: 2}, {dolor: 3}]

代码味道!

这块感觉真的很糟糕。特别是block_given?行。有没有更好的方法来写它?

def ipsum &block
  data = get_data
  data.each { |id| block.call dolor(id) } if block_given?
  data
end

我可以以某种方式使用&method或其他一些魔法吗?

1 个答案:

答案 0 :(得分:1)

您可以略微简化:

def ipsum
  data = get_data
  data.each { |id| yield dolor(id) } if block_given?
  data
end

利用Array#each返回数组的事实,这可以说更简单,但我不确定我是否喜欢它:

def ipsum
  return get_data unless block_given?
  get_data.each { |id| yield dolor(id) }
end