我正在学习 Ruby,并且在使用时发现了有趣的行为Object#freeze
带变量的方法。
在我冻结一个变量之后(或者Fixnum
or 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}"
但是,当我尝试在冻结后将某些内容推入数组时,它会引发错误,正如预期的那样:
test = [666]
var = [90]
#ok
var += [5]
puts "var.frozen? #{var.frozen?}"
var.freeze
puts "var.frozen? #{var.frozen?}"
var << test
puts "var = #{var}"
有人可以向我解释这个问题吗?看起来很奇怪。
Edit我使用的是 Windows XP + Ruby 1.9.3-p429
您冻结对象,而不是变量,即您无法更新冻结的对象,但可以将新对象分配给同一变量。考虑一下:
a = [1,2,3]
a.freeze
a << 4
# RuntimeError: can't modify frozen Array
# `b` and `a` references the same frozen object
b = a
b << 4
# RuntimeError: can't modify frozen Array
# You can replace the object referenced by `a` with an unfrozen one
a = [4, 5, 6]
a << 7
# => [4, 5, 6, 7]
顺便说一句:冷冻是没有用的Fixnum
s,因为它们是不可变的对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)