Ruby:为什么'和'不'工作'&& !(expr)'没有?

时间:2010-02-12 01:36:17

标签: ruby-on-rails ruby

我的Rails应用程序中有一个if语句。我需要做一个基本的“if true and!false”检查。表达式定义为:

ActiveRecord::Base.connection.tables.include? 'settings' && !Settings.setting_is_set?('defaults_set')

如果我把它作为我的表达式给if,if就不会触发。如果我在控制台中运行该表达式,我会得到错误。

现在,如果我将表达式修改为:

ActiveRecord::Base.connection.tables.include? 'settings' and not Settings.setting_is_set?('defaults_set')

它应该返回true,并执行它的阻塞。

所以问题是:为什么'表达&& !表达'不像'表达式而不是表达'。这是我的理解&&而且!应该和,而不是几乎直接对应。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:6)

因为当你使用&&时,Ruby会将字符串的整个末尾解释为传递给include的单个参数。将括号括在'settings'周围,第一个语句将正常工作:

ActiveRecord::Base.connection.tables.include? 'settings' && !Settings.setting_is_set?('defaults_set')
# => false

ActiveRecord::Base.connection.tables.include?('settings') && !Settings.setting_is_set?('defaults_set')
# => true

不知何故,当您使用and not时,它知道第二部分不是传递给include的部分,并且您的呼叫成功。

答案 1 :(得分:0)

‘not’是一个控制运算符,!是一个逻辑运算符。不同之处在于评估命令时“not”的优先级较低。执行逻辑表达式时使用!