Ruby on rails 如何安全地检索可能不存在的Ruby方法的值?

Ruby on rails 如何安全地检索可能不存在的Ruby方法的值?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我以为我理解了try的工作原理,但我得到了一个未定义的方法错误: unknown_object.try(:some_method).try(:get_value) 我在中发现,只有当对象为nil时,它才从未定义的方法错误中解救出来。在我的例子中,我知道我的对象不是nil,但我不确定它是否有我需要的方法 如何安全地检索(并链接)这些方法,以避免出现未定义的方法错误?您要查找的行为是在以下位置实现的: Object#try现在将返回nil,而不是在 接收对象未实现该方法,但仍然可以获取 使用新的对

我以为我理解了
try
的工作原理,但我得到了一个未定义的方法错误:

unknown_object.try(:some_method).try(:get_value)
我在中发现,只有当对象为nil时,它才从未定义的方法错误中解救出来。在我的例子中,我知道我的对象不是nil,但我不确定它是否有我需要的方法


如何安全地检索(并链接)这些方法,以避免出现未定义的方法错误?

您要查找的行为是在以下位置实现的:

Object#try
现在将返回
nil
,而不是在 接收对象未实现该方法,但仍然可以获取 使用新的
对象的旧行为#试试

以下是新的
try
的Rails 4源代码:

def try(*a, &b)
  if a.empty? && block_given?
    yield self
  else
    public_send(*a, &b) if respond_to?(a.first)
  end
end

唯一的区别是
if respond\u to?(a.first)

您要查找的行为是在以下位置实现的:

Object#try
现在将返回
nil
,而不是在 接收对象未实现该方法,但仍然可以获取 使用新的
对象的旧行为#试试

以下是新的
try
的Rails 4源代码:

def try(*a, &b)
  if a.empty? && block_given?
    yield self
  else
    public_send(*a, &b) if respond_to?(a.first)
  end
end

唯一的区别是
if respond_to?(a.first)

try
仅当您在nil对象上调用它时才能按预期工作。既然你的是一个有效的对象,我想你需要的是回应

if unknown_object.respond_to?(:some_method)
  unknown_object.some_method.get_value
end

try
仅当您在nil对象上调用它时才按预期工作。既然你的是一个有效的对象,我想你需要的是回应

if unknown_object.respond_to?(:some_method)
  unknown_object.some_method.get_value
end

这是一种铁路运输方式。。我想你也应该把它标记为RubyonRails。哦,我还以为这是一个ruby方法。哎呀,我以前就知道了……这是一种轨道方法。。我想你也应该把它标记为RubyonRails。哦,我还以为这是一个ruby方法。哎呀,我以前就知道了……这个答案没有错,事实上它更普遍地正确。但是对于Rails 4的人来说,Stefan死定了,这个答案没有错,事实上,它更普遍地是正确的。但是对于Rails 4,Stefan已经死定了