只有当它存在时才调用方法

是否存在某种隐藏的 Ruby/Rails 魔术,仅仅在方法存在时才调用它?

假设我想打电话

resource.phone_number

但是我事先不知道资源是否响应 phone_number

resource.phone_number if resource.respond_to? :phone_number

如果用错了地方就不好看了。我很好奇是否存在一些更接近于 try使用方式(resource.try(:phone_number))的方法。

76925 次浏览

如果您对标准的 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)

会如你所愿。

我知道这是非常古老的职位。但我只是想知道这是否是一个可能的答案以及影响是否相同。

resource.try(:phone_number) rescue nil

谢谢

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

resource.phone_number if defined? resource.phone_number

如果定义了 A.c而没有定义 A.aA.b,那么你可以做 A.a rescue A.b rescue A.c,它会像魔法一样工作。不过你会打破一些愚蠢的规则。

我不知道效率如何,但是..。

Klass.methods.include?(:method_name)

在 Rails 4为我工作