ここでは、遅延評価の概念を示す簡単なプログラムを紹介します。ルビーの遅延評価で何が問題になったのですか
class A
def x
y += 1
end
def y
@y ||= 0
end
end
A.new.x
しかし、私は
NoMethodError: undefined method `+' for nil:NilClass
このプログラムを実行するときにこのような結果を得た私は何か間違ったことをやっていますか?
@y
が配列の場合、問題なく動作します。
class A
def x
y << rand(10)
end
def y
@y ||= []
end
end
a = A.new
a.x
UPDATE
最後に、私は問題を理解しています。 Rubyは値渡しです。最初の例でメソッドy
を呼び出すと、Rubyはinstance_variableを気にせず、@y
の値だけをコピーして返します。
第2の例では、Rubyは依然として変数@y
の値をコピーして返します。しかし、この場合、@y
は実際の配列のポインタであり、このポインタのコピーは同じ配列を指しています。
しかし、なぜエラーがundefined method + for nil
であるか、私はyがyの値と等しいことを期待しています。なぜこの場合yがnil
になるのですか?
_ _「Rubyは値渡しである」 - あなたは任意の引数を渡すことはありません。 – Stefan
質問であなたが報告したエラーが発生したときは、それが発生した行を指定する必要があります。より一般的には、例外メッセージには、しばしばエラーを特定する貴重な情報が含まれています。それらに細心の注意を払う。 –