私はRubyを学んでいますが、Object#freeze
メソッドを変数に使用すると面白い動作が見つかりました。Rubyのフリーズ変数が機能しない
変数(Fixnum
またはArray
のいずれか)をフリーズした後でも、まだ変更できます。それは私がこれについて起こるべきでない限り、TypeError
が提起されるべきであるので、奇妙です。同じアレイにある
test = 666
var = 90
#ok
var += 5
puts "var.frozen? #{var.frozen?}"
var.freeze
puts "var.frozen? #{var.frozen?}"
var = test
puts "var = #{var}"
:ここ
は私のコードです
test = [666]
var = [90]
#ok
var += [5]
puts "var.frozen? #{var.frozen?}"
var.freeze
puts "var.frozen? #{var.frozen?}"
var = test
puts "var = #{var}"
しかし、私は凍結後のアレイに何かをプッシュしようとすると、期待どおり、それは、arrorが発生します。
test = [666]
var = [90]
#ok
var += [5]
puts "var.frozen? #{var.frozen?}"
var.freeze
puts "var.frozen? #{var.frozen?}"
var << test
puts "var = #{var}"
誰かがこの問題を説明できますか?奇妙に思える。私は、あなたがオブジェクトではなく、変数を凍結するのWindows XP + Rubyの1.9.3-p429
好奇心:
はあなたがここに合理的について読むことができます:あなたは、オブジェクトの内部構造を露出させたときに、やっていることに注意を払っていない場合、これは、ハード、あなたをかむことができます - なぜ 'test' =' 666'なのですか?P – sircapsalot
これはフリーズするものではありません。意図どおりに動作しています。リテラル番号のような不変の値をフリーズすることはできず、変数を「フリーズ」することができないため、新しい値に設定することはできません。オブジェクトはフリーズするだけです。 – meagar
@meagar:immutablesをフリーズすることができます。彼らはとにかく変更することができないので、ちょうど無意味です。しかし、「5.フリーズ」は「5.フリーズ」が「真」を返すという意味では機能します。 –