只有存在时才调用方法
有没有一些隐藏的Ruby / Rails的魔术只是简单地调用一个方法,如果它存在?
可以说我想打电话
resource.phone_number
但是我不知道资源是否响应phone_number
。 一个办法是做到这一点
resource.phone_number if resource.respond_to? :phone_number
如果在错误的地方使用,这并不是那么漂亮。 我很好奇,如果有什么东西存在,更符合如何使用try
( resource.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
被定义,而Aa
和Ab
不是,那么你可以做Aa rescue Ab rescue Ac
,它会像魅力一样工作。 不过,你会打破一些愚蠢的规则。