2017-09-30 5 views
0

Ruby/Railsの新機能です。 fooが定義されている場合(すなわち、nilでない場合)に、Test :: Unitメソッドassert_not_nil fooが真であるようです。右?assert_not_nil foo == assertは定義されていますか? Rubyのテスト::ユニットのfoo?

assert defined? fooに相当しますか?

そうでない場合、どのように違いますか?もしそうなら、私はこれらのうちの1つを他のものよりも好む理由がありますか? assertassert_equalassert_notなどのような、より専門的なアサーションメソッドの代わりに他の式と組み合わせることができるように

は、たぶん、より一般的に、それはそうです。しかし、特殊な方法がより標準的な慣行であると思われます。そうですか?何故ですか?

答えて

1

nilは値なので、値がnilの変数が定義されます。ここではいくつかのREPLの出力を発揮するのです:未定義のインスタンス変数にアクセスするにもnilを返すため

[1] pry(main)> a = nil 
=> nil 
[2] pry(main)> defined? a 
=> "local-variable" 
[3] pry(main)> defined? b 
=> nil 

あなたは混乱するかもしれないが、それはまだ同じではありません。

[4] pry(main)> defined? @b 
=> nil 
[5] pry(main)> @b = nil 
=> nil 
[6] pry(main)> defined? @b 
=> "instance-variable" 

グローバル変数($foo)は、インスタンスのように動作この点に関しては、初期化されていないクラス変数(@@bar)にアクセスすると、NameErrorが発生します。

最後に、ローカル変数はRubyの解析時に宣言されるため、メソッドのブランチにローカルが設定されていれば、そのローカルはメソッド(またはブロック)のどこにでも定義されます(nilに初期化されます)。

+0

非常に有益な答え、ありがとう。 – globewalldesk

+0

もし 'foo = nil'なら' assert defined? 'の間に 'assert_not_nil foo'は' false'ですか? foo'は 'true'です。右? – globewalldesk

+1

それは正しいです。 – crazymykl

関連する問題