ruby - 在 Ruby 中卡住变量不起作用

标签 ruby arrays variables

<分区>

我正在学习 Ruby,我刚刚发现在使用带变量的 Object#freeze 方法时有一些有趣的行为。

在我卡住一个变量(FixnumArray)之后,我仍然可以修改它!这很奇怪,因为就我而言这不应该发生并且应该引发 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}"

谁能给我解释一下这个问题?看起来很奇怪。

编辑 我使用的是 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 是没有用的,因为它们是不可变的对象。

关于ruby - 在 Ruby 中卡住变量不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17067171/

相关文章:

ruby - 如何与 `each` 迭代器中的前一项进行比较?

python - 将数组中的所有分类元素编码为二进制元素

javascript - 由数组选择的 jQuery css 左/右

javascript var 与这个

ios - iOS环境变量在哪里设置?

ruby 修改project.pbxproj

php - 正则表达式计算不同排列的数量

java - 无法让二维数组进行洗牌

javascript - JSON 可序列化变量的命名约定

ruby-on-rails - Nokogiri 解析完全在本地主机上工作,但部分在 heroku 上工作