2

写真が指定された縦横比に一致するかどうかを判断するために、次のように使用しました。

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

ただし、幅だけが 1250 で高さが任意の値の場合、これは true を返しました。rails コンソールでこの正確なコマンドを実行すると、exif2.height が 833 でない場合に 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が、それでも括弧を付けて 2 行で記述します。私はあまりにも多くのインタープリターとコンパイラーの戦いを経験してきましたが、いつ何が起こるかを彼らに任せることはできませんでした。

于 2013-03-29T19:38:09.940 に答える