有条件的&&没有短路

时间:2014-07-28 13:48:01

标签: ruby-on-rails ruby

我有一个简单的条件检查,看一个对象(称之为模型)是否与另一个对象有一个has_many关联(称之为关联)。

if model.respond_to? association.pluralize.to_s && !model.send(association.pluralize).nil?
  puts "Hello World"
end

每次调用此检查时,rails会在模型上为该关联抛出undefined method

在控制台中调试时,我试图分开代码失败的地方。

if model.respond_to? association.pluralize.to_s 
  puts "Hello World"
end

通过删除条件的后半部分,它会停止失败(并且不会按预期打印)。同时直接检查model.respond_to? association.pluralize.to_s,始终返回false。

所以我再试一次:

if false && !model.send(association.pluralize).nil?
  puts "Hello World"
end

这样可以正常工作,没有任何错误,也没有打印(我想要)。

那么为什么在第一组代码中,条件不短路呢?第一部分总是返回false,但仍然评估后半部分导致NoMethodError。是否有一些"陷阱"导致此问题导致respond_to?send?还是更简单的东西?任何帮助都会非常感谢!

2 个答案:

答案 0 :(得分:10)

您有此错误,因为

if model.respond_to? association.pluralize.to_s && !model.send(association.pluralize).nil?

相当于:

if model.respond_to?(association.pluralize.to_s && !model.send(association.pluralize).nil?)

&&的优先级高于respond_to?方法调用的优先级。 如果要使其正常工作,请使用括号:

if (model.respond_to? association.pluralize.to_s) && (!model.send(association.pluralize).nil?)

答案 1 :(得分:1)

这是条件陈述中的歧义,请尝试:

if model.respond_to?(association.pluralize.to_s) && !model.send(association.pluralize).nil?
  puts "Hello World"
end
相关问题