如何在Ruby中表达"使用此对象,如果存在,执行此操作"的习惯用法?

Gun*_*ars 5 ruby

通常在Ruby(特别是Rails)中,您必须检查是否存在某些内容,然后对其执行操作,例如:

if @objects.any?
  puts "We have these objects:"
  @objects.each { |o| puts "hello: #{o}"
end
Run Code Online (Sandbox Code Playgroud)

这是最短的,一切都很好,但如果你有@objects.some_association.something.hit_database.process而不是@objects?我必须在if表达式中第二次重复它,如果我不知道实现细节并且方法调用很昂贵怎么办?

显而易见的选择是创建一个变量,然后测试它然后处理它,但是你必须提出一个变量名(ugh),它也会在内存中挂起,直到作用域结束.

为什么不是这样的:

@objects.some_association.something.hit_database.process.with :any? do |objects|
    puts "We have these objects:"
    objects.each { ... }
end
Run Code Online (Sandbox Code Playgroud)

你会怎么做?

Kyl*_*mus 2

水龙头呢?

@objects.some_association.something.hit_database.process.tap do |objects|
  if objects.any?
    puts "We have these objects:"
    objects.each { ... }
  end
end
Run Code Online (Sandbox Code Playgroud)