加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby中的冻结变量不起作用

发布时间:2020-12-16 19:30:56 所属栏目:百科 来源:网络整理
导读:参见英文答案 += operator appears to modify frozen string2 我正在学习Ruby,而在使用Object#freeze方法和变量时,我发现有趣的行为. 在我冻结一个变量(Fixnum或Array)之后,我仍然可以修改它!这是奇怪的,因为就我而言,这不应该发生,应该引发TypeError. 这是
参见英文答案 > += operator appears to modify frozen string2
我正在学习Ruby,而在使用Object#freeze方法和变量时,我发现有趣的行为.

在我冻结一个变量(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}"

但是当我试图在冻结之后把东西推到阵列中时,就像预期的那样引起了一个恐怖:

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,6,7]

除此之外:冻结Fixnums是非常无用的,因为它们是不可变的对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读