为什么variable = true和false会导致rails模型中的值为true,但在控制台中则不会

时间:2013-03-29 17:51:09

标签: ruby-on-rails ruby

为了确定照片是否符合指定的宽高比,我使用了这个:

exif2 = EXIFR::JPEG.new(photo.queued_for_write[:medium].path)
self.featured = exif2.width == 1250 and exif2.height == 833

然而,如果宽度为1250但高度为任何值,则返回true。如果exif2.height不是833,则在rails控制台中运行此命令将返回false。将其更改为下面的if语句有效,但是

if exif2.width == 1250 and exif2.height == 833
  self.featured = true
else
  self.featured = false
end

我不明白为什么,我正在尝试学习rails,所以我觉得理解它对我有用。

2 个答案:

答案 0 :(得分:7)

运算符优先级,and的优先级低于=

所以你的第一个表达式被评估为

( self.featured = exif2.width == 1250 ) and ( exif2.height == 833 )

您的条件是如此评估的

if ( exif2.width == 1250 ) and ( exif2.height == 833 )

。 。 。显示您的不同答案虽然令人困惑但并非由于任何不一致而导致

使用&&代替and

答案 1 :(得分:1)

要学习的课程是理解运算符的优先级,使用括号来强制操作的顺序,而不是希望你使它们正确,并避免使用and

此:

exif2.width == 1250 and exif2.height == 833

比阅读和理解要困难得多:

(exif2.width == 1250) and (exif2.height == 833)

然而,由于优先级,您还必须将整个测试包装在括号中:

(
  (exif2.width == 1250) and
  (exif2.height == 833)
)

适用于=作业。

我避开了and,并会使用:

(
  (exif2.width == 1250) &&
  (exif2.height == 833)
)

因为这确实是两个测试结果的布尔测试。 &&的优先级高于and,但即便如此,我仍然会用括号将它写在两行上。我经历了太多的翻译和编译器战斗,让他们决定在什么时候会发生什么。