-1

誰かがこれが機能する理由についていくつかのガイダンスを提供できますか?

self.primary_format == "Single" || self.primary_format == "EP"

しかし、これはしません

self.primary_format == "Single" || "EP"

これを行うためのより簡潔な方法はありますか?

私は以下を実行する必要があり、可能な限りきれいにしたいと思います。上記に基づいて、私は以下が正しく機能することを確信していません。

self.release.primary_genre.id ==  3 || 6 || 8 || 12 || 18

どうもありがとう!

編集:これらはifステートメントの一部であることを指摘しておく必要があります。

4

3 に答える 3

1

ルビーでは、nilとfalseはBoolean false、その値がfalseまたはnilの場合にのみ条件が失敗することを意味すると見なされます。

self.primary_format == "Single" || self.primary_format == "EP"

上記のステートメントでは、primary_formatが「Single」または「EP」のいずれかである必要があることを確認しています。そうでない場合は失敗します。

self.primary_format == "Single" || "EP"

上記のステートメントには2つのステートメントself.primary_format == "Single""EP" あるため、これらのいずれかが正しい場合に条件が渡されます。ただし、rubyによると、ブール式ではnilとfalse以外のオブジェクトはtrueと見なされます。この場合self.primary_format、条件の値に関係なく、常にtrueが返されます。

したがってinclude?、配列のメソッドを使用する必要があります

[3, 6, 8, 12, 18].include?(self.release.primary_genre.id )
于 2012-09-24T11:45:30.107 に答える
1

これはの通常のセマンティクスです||。と比較self.primary_formatしてい"Single"ます。異なる場合は"EP"、ブール値でチェックしています(そうでない場合とそうでnilない場合false)。

あなたが何を意味するかを表現するための私の好ましい方法は

["Single", "EP"].include? self.primary_format
[3, 6, 8, 12, 18].include? self.release.primary_genre.id

代わりにinclude?、同等のを使用することもできますmember?

より自然な順序で条件を記述したい場合は、「逆の「メンバーはありますか?」」の回答を読んでください。ルビーの方法?

于 2012-09-24T11:46:40.657 に答える
1

最初の例を分解してみましょう。

self.primary_format == "Single" || self.primary_format == "EP"

演算子の優先順位を適用して括弧を追加すると、次のようになります。

(self.primary_format == "Single") || (self.primary_format == "EP")

はメソッドなので#==、次のようになります。

(self.primary_format.==("Single")) || (self.primary_format.==("EP"))

の値を入力してみましょうself.primary_format。どうですか"EP"

("EP".==("Single")) || ("EP".==("EP"))

#==両側でメソッドを呼び出すと、

(false) || (true)

左側が偽物であるため、右側を返します。

true


次に、2番目の例を分解してみましょう。

self.primary_format == "Single" || "EP"

演算子の優先順位を適用して括弧を追加すると、次のように==バインドされるため、これが得られ||ます。

(self.primary_format == "Single") || ("EP")

もう一度、#==そのメソッド呼び出しバリアントに切り替えましょう。

(self.primary_format.==("Single")) || "EP"

"EP"もう一度forを入力してみましょうself.primary_format

("EP".==("Single")) || "EP")

を呼び出す#==と、

(false || "EP")

の左側||が偽物なので、右側が返されます。したがって、値は次のとおりです。

"EP"

それはどちらfalseでもないので、それ自体は真実nilです。


したがって、要約すると、演算子がその側の式をどのように好むか、||またはグループ化するかについて考える必要があります。==

最初の例では、「この値が「Single」に等しい場合は「true」を教えてください。そうでない場合は「EP」に等しい場合は「true」を教えてください。それ以外の場合は「false」を教えてください」

2番目の例では、「この値が「Single」と等しい場合は「true」を教えてください。そうでない場合は「EP」を教えてください」と述べています。

お役に立てば幸いです。

于 2012-09-24T12:05:19.913 に答える