1

这就是我正在尝试的

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或其他一些魔法吗?

4

1 回答 1

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
于 2013-06-22T01:53:14.400 回答