只有存在时才调用方法

有没有一些隐藏的Ruby / Rails的魔术只是简单地调用一个方法,如果它存在?

可以说我想打电话

resource.phone_number 

但是我不知道资源是否响应phone_number 。 一个办法是做到这一点

 resource.phone_number if resource.respond_to? :phone_number 

如果在错误的地方使用,这并不是那么漂亮。 我很好奇,如果有什么东西存在,更符合如何使用tryresource.try(:phone_number) )的路线。

如果你对标准ruby语法不满意,你可以自由地:

 class Object def try_outside_rails(meth, *args, &cb) self.send(meth.to_sym, *args, &cb) if self.respond_to?(meth.to_sym) end end 

现在:

 resource.try_outside_rails(:phone_number) 

会像你想要的那样行事。

我知道这是很老的post。 但只是想知道这是否可能是一个可能的答案,是否影响是一样的。

 resource.try(:phone_number) rescue nil 

谢谢

从Ruby 2.3.0(现在仍然处于预览状态)开始,您可以使用新的安全导航操作符 :

 resource&.phone_number 

另外,如果有人对所选语法感兴趣,我build议您在Ruby的问题跟踪系统中检查function请求的讨论。 我也在这里解释了我的答案的推理。

我会尝试defined?http://ruby-doc.org/docs/keywords/1.9/Object.html#defined-3F-method )。 它似乎正是你所要求的:

 resource.phone_number if defined? resource.phone_number 

如果Ac被定义,而AaAb不是,那么你可以做Aa rescue Ab rescue Ac ,它会像魅力一样工作。 不过,你会打破一些愚蠢的规则。