是否有一些隐藏的 Ruby/Rails-magic 仅在方法存在时才调用它?
可以说我想打电话
resource.phone_number
但我事先不知道资源是否响应phone_number. 一种方法是
resource.phone_number if resource.respond_to? :phone_number
如果在错误的地方使用,那并不是那么漂亮。我很好奇是否存在更符合try使用方式的东西(resource.try(:phone_number))。
是否有一些隐藏的 Ruby/Rails-magic 仅在方法存在时才调用它?
可以说我想打电话
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)
将按照您的意愿行事。
我会尝试defined?(http://ruby-doc.org/docs/keywords/1.9/Object.html#defined-3F-method)。它似乎完全符合您的要求:
resource.phone_number if defined? resource.phone_number
我知道这是很老的帖子。但只是想知道这是否是一个可能的答案以及影响是否相同。
resource.try(:phone_number) rescue nil
谢谢
我不能说效率,但像......
Klass.methods.include?(:method_name)
在 Rails 4 中为我工作
如果A.c已定义和未定义A.a,A.b您可以做A.a rescue A.b rescue A.c,它会像魅力一样工作。不过,你会打破一些愚蠢的规则。