1

私はvar.nil?しばらく使用してきましたが、それは私のコード全体にあります。突然、私はそれの後にundefined local variable or method変数を取得しています.nil?

どうしたの?.nil?壊れていますか?IRB オンラインで試してみて、自分の環境にないことを確認しました。次のように入力できるはずです。

me.nil?

変数が定義されていない場合、それはtrueとして返されるはずです。それが要点ですが、私はundefined local variable or method me for main:Object

多分私はnil?間違っていて、次のようなものを使用する必要があります:

defined?(me) == nil

.nil?既存のオブジェクトでのみ使用できますか? これは私が理解した方法ではありませんでした。ルビーのドキュメントには、次のようにさえ書かれています。

nil.nil?               -> true
<anything_else>.nil?   -> false

ここで夢中になります。

より詳しい情報

私はできることを理解しています:

unless defined? me
 do something

しかし、同等のものは次のif me.nil?とおりです。

if defined?(me) == nil?

右?他に方法はありませんか?

今、私は自分の知識だけでなく、正気を疑っています:)

結論:

わかりました。.nil?存在しないインスタンス変数に対しても機能します。存在しないハッシュまたは配列キーでも機能しますが、存在しないローカル変数では機能しません。私にとって、これは大きな間違いです。おそらく最もよく使用されるアイテム (ローカル変数) を除いて、ほとんどすべてで機能することを覚えておく必要があります。

私の結論は、これはローカル変数がRubyのメソッドと混同される可能性があるという事実と関係があります.それらを区切る構文には何もありません$.変数であり、メソッドと混同されることはありません)。

4

2 に答える 2

1

実際、あなたは正しく、間違っています。ない?インスタンス変数では機能しますが、ローカル変数またはクラス変数では機能しません。だからあなたがするなら

@me.nil? => true

インスタンス変数は、デフォルトで nil に割り当てられているため、エラーになりません。

しかし、もしそうなら

me.nil? => NameError
于 2013-09-19T11:28:46.797 に答える
0

それは明らかです。変数またはメソッドの場合は、事前に定義する必要があります。

'me'.nil? -> false. This is correct as the string 'me' is not nil.

上記の例では、'me' は String クラスの自己オブジェクトとして機能します。

 Now, me.nil? without defining the variable or method me will definitely throw an error.

上記のものでは、 me オブジェクトはどこにも定義されていません。

var (変数またはメソッド) の定義が削除されたなど、コードが最近誰かによって変更されていないことを確認してください。

はい、nil は既存のオブジェクトでのみ使用できます。文字列を直接使用する場合は、self オブジェクトが使用されます。変数を使用する場合は、必ず何かに割り当てる必要があります。

于 2013-09-19T11:00:18.510 に答える