0

変数の定義に好奇心があります。私は変数の定義について知っています、それはそれがどのように機能するかを理解することだけです。定義されていない場合は、myvarを0に設定するという考え方です。falseはfalseまたはnilによって返される可能性があるため、falseは使用しません。

def foo
  myvar=1000

  myvar = ((defined? myvar)==nil) ? 0 : myvar
  puts myvar
end

foo # => 1000

しかし

def foo
  # myvar=1000

  myvar = ((defined? myvar)==nil) ? 0 : myvar
  puts myvar
end

foo # => nil

しかし

def foo
  mybool = ((defined? myvar)==nil)
  myvar = mybool ? 0 : myvar
  puts myvar
end

foo # => 0 it rocks !

これは、最終テストが評価される前にブールテストがmyvarに影響を受けた場合のようなものです。 ((defined? myvar)==nil)2つの可能性を定義しますか?myvarは可能性がありnil、テストの右側はnil可能性がありますnil(それはnil)。

このテストのnil部分を取り除くために、私はこのコードを試しました:

def foo    
  mylocalvariable = 2 # it gives 'local-variable' and not nil
  puts ((defined? myvar) == (defined? mylocalvariable ))
  myvar = ((defined? myvar)!=(defined? mylocalvariable )) ?  0 : myvar
  puts myvar
end

foo # => nil

テストの最初の部分はmyvarの影響を受けたようですが、代入演算子は()または比較演算子の後にあります。アイデアはありますか?他のコードは必要ありませんが、なぜそのように機能するのですか。ありがとうございました。

4

3 に答える 3

3

他のコードは必要ないかもしれませんが、単純なことを達成するために長い道のりを進んでいるので、いくつかのコードが必要です。未定義の変数を0に設定する場合は、次を使用します。

myvar ||= 0

それはどのように機能しますか?||=は条件付き代入演算子であり、基本的に左側で割り当てられている変数を調べ、nilまたはfalseの場合は、右側の値を代入します。これは多くの言語で見られるトリックです。

三項(?:)ステートメントは小さなif/then/elseステートメントには役立ちますが、実行したいことに対して実際には正しい選択ではありません。代わりに、以外||=のものを使用する場合は、次を使用します。

myvar = 0 unless myvar

繰り返しになりますが、値がゼロの場合だけでなくmyvar、値である場合は、これらすべてが再割り当てされます。falseこれは潜在的な問題ですが、開発者としては、私たちが管理しているはずであり、変数が保持している値のタイプを常に把握している必要があるため、それほど大きな問題にはなりません。

于 2013-03-12T16:06:05.037 に答える
0

私はなぜだか知っています。myvar =をコーディングし、defined?myvarをテストする場合、rubyはmyvarが定義されていると見なします。myvar =を削除すると、myvarはテストで未定義と見なされます。左の部分は右の部分の前に読み取られます。

于 2013-03-13T06:05:34.540 に答える
0

こんにちはこの種の演算子は三項演算子です。

Example:
@x = 1
@y = 2
@x>2 ? puts "YES" : puts "NO"

ActiveRecordかどうかを確認することもできます

Example:
@x = User.find(:all, :conditions => ["id = ?", 1])
@x.nil? ? puts "Null" : puts "Not Null"
于 2013-03-13T03:47:52.653 に答える