为了确定照片是否符合指定的宽高比,我使用了这个:
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,所以我觉得理解它对我有用。
答案 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
,但即便如此,我仍然会用括号将它写在两行上。我经历了太多的翻译和编译器战斗,让他们决定在什么时候会发生什么。