1

更新:2つの変数を間違って入力しました...とても恥ずかしいです。みんなの努力に感謝します!

申し訳ありませんが、2つの異なる環境に間違った値を入力しました。最初の1つは設定sort = 0rating=1ましたが、irbでは設定sort=1rating=0ました。それが評価するa and bときa=1だけbなので、2番目の状況で私は得falseます。今、それは明らかになります。不注意でごめんなさい、みんなの努力に感謝します!

======================

私の質問:私は2つの変数を持っていますsortrating、両方ともsort&&rating == 1sort and rating ==1以下のように2つの異なる環境で異なる動作をします:

まず、railsのデバッガー環境で実行するrails server --debugと、すべてが返されtrueます:

(rdb:130) rating 
1
(rdb:130) sort
0
(rdb:130) sort and rating == 1
true
(rdb:130) sort && rating == 1
true
(rdb:130) (sort && rating) == 1
true

第二に、通常のirbでは、それらはすべて戻りfalseます:

irb(main):001:0> sort = 1
=> 1
irb(main):002:0> rating = 0
=> 0
irb(main):003:0> sort||rating
=> 1
irb(main):004:0> sort and rating
=> 0
irb(main):005:0> sort and rating == 1
=> false
irb(main):006:0> sort && rating == 1
=> false
irb(main):007:0> 0 == true
=> false
irb(main):008:0> 

Rubyは非常に動的であるため、この状況は可能ですか?

4

4 に答える 4

3

はい、この状況は可能で0あり1、数値(Fixnumクラス)として評価されるため、両方とも。とは異なりfalseます。そして、偽でないものはすべてtrue(を除いてnil)でなければなりません。

この.zero?メソッドを使用して、に暗黙的に変換することができますboolean

さらに、演算子||とはおよびと&&は異なります。後者は割り当てよりも優先順位が低いため、入力するとorand

sort and rating

実際に起こることは、2番目のオペランドだけが評価されるため(結果としてその値だけがプッシュされるため)、自明に考えるようにステートメントが実行されないことです。

について考える

ruby-1.9.2-head > 4 and 3
 => 3 
ruby-1.9.2-head > 3 and 4
 => 4 
于 2012-06-11T02:07:04.510 に答える
0

これは、Rubyのダイナミズムとは関係がなく、たとえばJavaScriptやCとは異なり、Rubyではゼロがfalseと評価されないという事実と関係があります。

于 2012-06-11T02:37:32.153 に答える
0

まず、ブールコンテキストでは、ゼロはRubyではfalseではなくtrueと評価されます。間違っているのはfalseそれ自体とnil。空の配列、空の文字列、数値のゼロなど、その他すべてが真であると見なされます。

第二に、ブール演算子はあなたが思っているように振る舞わないかもしれません。and&&は優先順位を除いて同じなので、同様orにと||。それらを総称してANDとと呼びORます。ルールは次のとおりです。

a AND baがfalseの場合はaを返し、aがtrueの場合はbを返します。

a OR baがtrueの場合はaを返し、aがfalseの場合はbを返します。

したがって、これらは実際にはそれぞれif a then b else aif a then a else bの省略形です。真理値表はおなじみのものですが、実際の結果は、新しく作成された純粋なブール値ではなく、入力の1つと常に同じです。

優先順位の違いにもかかわらず、これの両方のバージョン:

sort AND rating == 1

これに相当します:

sort AND (rating == 1)

したがって、sortはゼロであり、これはtrueであるため、上記の式は、の値を返します(rating == 1)。これもtrueです(実際にはtrue)。と一緒に行っていたら、1ではないのでrating AND sort == 1そうなるでしょう。falsesort

上記のルールに従うと、他の結果がどこから来るかを確認できます。

注:true Andrewがコメントで述べたように、これらのさまざまな「真の」値はすべて、それ自体とはまだ異なります。0は真と見なされる場合がありますが、0 == trueそれでも偽です。(これは、条件付きコンテキストで非ブール値を許可するすべての言語に適用されます。たとえば、Cでは、ゼロ以外の数値はすべて真ですが、ゼロ以外の2つの数値が等しいことを意味するわけではありません。)

これは混乱を招く可能性があるため、特にtrue /のような書式設定のトリックを使用できない口頭またはプレーンテキストのコミュニケーションではtrue、RubyistsはStephen Colbertからページを取得し、trueであるが必ずしも必要ではないtrue値をまとめて「truthy」と呼ぶことがよくあります。 "、およびその反対は" false "(または" falsey ";両方のスペルを見たことがあります)。この規則は、他の言語(特に、JavaScriptの本のDouglas Crockfordによって)でも使用され、条件付きコンテキストでtrueまたはfalseと評価される他の値から実際のブール値を区別します。

ETA :からのsort and rating==1帰国の結果は再現できません。1.8.7と1.9.3の両方で、上記に基づいて期待される出力が得られます。falseirb

$ irb
irb(main):001:0> sort=0
=> 0
irb(main):002:0> rating=1
=> 1
irb(main):003:0> sort and rating==1
=> true
于 2012-06-11T02:37:36.187 に答える
0

簡単に言えば、Rubyでは、論理式は式の結果を決定する最初の値を返します。それ以外の場合は、最後に評価された値を返します。

次のコードを読んでください。

true and "foo"

ご存知のように、andオペレーターは両方の値がとして評価されることを確認する必要がありますtrue。ただし、を評価するだけではまだ決定されていないtrueため、式の最終値として、真である決定的な要素である"foo"が受け入れられます。

もう一つの例:

false and true

ほら、falseここで決定的なので、返されます。

この:

false and nil

false同じ理由で、また戻ります。

このルールはor演算子にも使用できます。値がtrueの左側のように評価されたor場合、右側はそれ以上評価されません。

強化する必要があると思うもう1つの概念は、Rubyでは、何でも期待されているfalseことnilですtrue

于 2012-06-11T03:31:45.560 に答える