2

为了确定一张照片是否符合指定的纵横比,我使用了这个:

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,所以我认为理解它对我很有用。

4

2 回答 2

7

运算符优先级,and甚至低于=

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

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

你的条件是这样评估的

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

. . . 表明您的不同答案虽然令人困惑,但不是由于任何不一致

使用&&而不是and在你可以使用的地方

于 2013-03-29T17:57:27.497 回答
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 的布尔测试。&&具有比 更高的优先级and,但即便如此,我仍然会用括号将它写在两行上。我经历了太多的解释器和编译器之争,无法让他们决定何时发生什么。

于 2013-03-29T19:38:09.940 回答