这是我正在尝试的事情
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
或其他一些魔法吗?
答案 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