在 Ruby 中冻结变量不起作用 [重复]

2024-02-19

我正在学习 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]

顺便说一句:冷冻是没有用的Fixnums,因为它们是不可变的对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Ruby 中冻结变量不起作用 [重复] 的相关文章

  • 如何全局忽略 UTF-8 字符串中的无效字节序列?

    我有一个 Rails 应用程序从 Rails 版本 1 以来的迁移中幸存下来 我想忽略all其上的无效字节序列 以保持向后兼容性 我不知道输入编码 示例 gt Men xFC split n ArgumentError invalid by
  • 如何在没有副本的情况下将结构转换为字节数组?

    StructLayout LayoutKind Explicit public struct struct1 FieldOffset 0 public byte a 1 byte FieldOffset 1 public int b 4 b
  • 面试题:三个数组,O(N*N)

    假设我们有three长度数组N其中包含任意数量的类型long 然后我们得到一个数字M 相同类型 我们的任务是选择三个数字A B and C每个数组中的一个 换句话说A should从第一个数组中选取 B从第二个开始和C从第三个 所以总和A
  • 使用 LINQ 从字符串数组中删除“NULL 行”

    如何使用 LINQ 从字符串数组中删除 NULL 行 采用这个结构 String Hello World Foo Bar null null null null null null null null Hello World Foo Bar
  • 为什么使用 reqwest 下载的 PNG 图像的字节与使用 Python 下载的不同?

    我正在尝试使用 reqwest 库来下载 PNG 文件 但是当我下载它时 我看到了其他编程语言的奇怪行为 例如 Python 例如 let content reqwest get https www google es images sea
  • 回形针:样式取决于模型(has_many 多态图像)

    我已将模型设置为使用多态图像模型 这工作正常 但是我想知道是否可以更改每个模型的 styles 设置 找到了一些使用 STI 模型 Art has many images as gt imageable Image belongs to i
  • 模块函数中使用的 $_ 变量为空 (PowerShell)

    这里有一个问题要问你 我有这个功能 function Set DbFile param Parameter ValueFromPipeline true System IO FileInfo InputObject Parameter Va
  • C++ 通过引用传递动态分配的二维数组

    这个问题是基于之前提出的问题而提出的 通过已知大小的引用多维数组传递 https stackoverflow com questions 529109 c pass by reference multidimensional array w
  • 如何加载 UrlHelper 和 Rails 中的路线?

    我想包括路线和link toPORO 中的方法 在控制台中测试这个时 我遇到了这个 如果我在没有路由助手的情况下包含 UrlHelper 一切似乎都工作正常 ruby 1 9 3 rc1 001 gt Rails version gt 3
  • 何时使用node.js、sinatra、rails? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这 3 种语言 框架的最佳用途是什么 混合所有 或 2 个 有用吗 如果您正在构建一个完整的 Web 应用程序 您可能应该使用 Rails 因为
  • 如何在 Ruby 中创建自定义排序方法

    我想指定一个自定义块方法 通过评估两个属性来对对象数组进行排序 然而 经过多次搜索 我没有找到任何没有的例子 lt gt 操作员 我想比较a to b if a x less than b x return 1 if a x greater
  • 通过链接导航多个对象而不重复

    我正在尝试浏览一堆带有其他对象链接的对象 我想从 id 1 开始并浏览每个对象 有些对象会循环回到之前的对象 所以我想确保每个对象只查看一次 否则我会陷入无限循环 我还希望能够通过链接导航来判断哪些对象无法访问 我认为导航顺序并不重要 这是
  • 通过 SSL 发布 UTF-8 时,HEROKU 上出现“EOFError:已到达文件结尾”

    我在 heroku 上遇到了奇怪的错误 为了重现它 我必须使用请求正文中的任何 UTF 8 字符制作大的 超过几 KB HTTPS POST 这是一个例子 require net https require uri Accutally I
  • 如何在 Ruby 中动态调用访问器方法[重复]

    这个问题在这里已经有答案了 不管这是否是好的做法 我如何在 Ruby 中动态调用访问器方法 这是一个示例类 class Test Class attr accessor a b end 我可以使用 Object send 方法来读取变量 i
  • 在汇编中初始化字符串数组

    我想创建一个数据数组 在初始化数据部分保存 5 个字符串 每个字符串正好有 4 个字符 每个字符串都有一些初始数据 例如第一个字符串的 abcd 第二个字符串的 efgh 等等 无效的 0任何字符串都不需要字符 如何用汇编语言初始化字符串数
  • 设置一个带有 JQuery 掩码的文本字段

    使用 watir webdriver 我尝试设置文本字段的值 browser text field id phoneNumbers value input set 5555551234 当我运行该命令时 我可以看到 watir 找到了该字段
  • 动态二维数组非连续内存C++

    假设我将二维数组的地址及其二维数组的行和列传递给函数 该函数会将二维数组的地址视为一维数组 例如 int Matrix 如果我执行下面的代码 int arr arr new int row for int i 0 i lt row i ar
  • 多维数组内的移动

    我有一个用表格显示的数组 如何使用用户输入进行移动 目前 0 被分配给每个数组 但我计划为该数组分配其他值 我的问题是 如何使用用户输入在数组内向上 向下 向右 向左移动和对角移动 Array 0 gt Array 0 gt 0 1 gt
  • 如何在 JavaScript 中对关联数组进行排序?

    我需要为我的一个项目通过 JS 对关联数组进行排序 我发现这个函数在 Firefox 中运行得很好 但不幸的是它在 IE8 OPERA CHROME 中不起作用 无法找到使其在其他浏览器中运行的方法 或者找到另一个适合该目的的函数 我真的很
  • 为 Rails 上的 postgresql 创建用户

    我选择 postgresql 作为我的 Rails 数据库 但当我尝试运行 rake db create all 时 我遇到了一个明显常见的错误 即 致命 角色 app 不存在 我找到了两种解决方案 但我不确定哪一种是正确的 有一个网站说

随机推荐

  • 为什么我的 Perl 祝福文件句柄不使用“can('print')”返回 true?

    由于某种原因 我无法让文件句柄与 Expect pm 一起使用log file方法 我最初得到的帮助是如何将文件句柄传递给 Perl Expect 的 log file 函数 https stackoverflow com question
  • 在 pymongo 中快速或批量更新

    如何在 pymongo 中进行批量更新插入 我想更新一堆条目 但一次更新一个非常慢 几乎相同问题的答案在这里 MongoDB 中的批量更新 更新插入 https stackoverflow com questions 4444023 bul
  • 与 CMake 交叉编译时的 Makefile 生成器规范

    我有两件事无法弄清楚 1 使用时CMake GUI 我们可以指定makefile生成器 我将使用 Debian Linux 交叉编译 Raspberry PI 我找不到相关的生成器 我必须选择哪种发电机 我有toolchain rpi cm
  • fscanf 读取最后一个整数两次[重复]

    这个问题在这里已经有答案了 我有以下简单的程序来读取文本文件 num txt 该文本文件每行包含数字 1 2 3 4 5 当我运行该程序时 它打印 5 两次 谁能告诉我为什么会发生这种情况以及如何解决它 提前致谢 int main void
  • 如何创建自动滚动列表

    我正在尝试使用 CSS 动画构建自动滚动列表 我现在得到了什么 players webkit transition opacity 0 5s ease out webkit animation autoScrolling 5s linear
  • Mac Spark-shell 初始化 SparkContext 时出错

    我尝试在 Mac OS Yosemite 10 10 5 上使用启动 Spark 1 6 0 spark 1 6 0 bin hadoop2 4 bin spark shell 它有以下错误 我也尝试安装不同版本的 Spark 但都有相同的
  • d3:在transition.tween() 中使用*name* 参数

    根据文档transition tween https github com mbostock d3 wiki Transitions tween calling transition tween name factory 为指定的对象注册一
  • 如何检查两个日期时间是否在彼此的特定范围内?

    我有两个 datetime64 对象 a 和 b 我想确定它们是否在彼此的特定范围内 然而 范围并不对称 如果a在b的 30到120分钟之间 a比b早半小时到晚2小时之间 则两者在期望的范围内 我的日期时间对象看起来像 m d Y H M
  • Swift 惰性和可选属性

    和有什么区别Lazy or Optional斯威夫特的财产 例如 如果有人正在构建一个从侧面进入的导航栏 我认为这一切都应该在一个内UIViewController 用户可能永远不会打开菜单 但有时他们会 var menu Navigati
  • 在 C++11 中实现递归代理模式

    假设我们有一些Foo允许的对象 cout lt lt myFoo 3 myFoo 5 bar 这需要代理设计模式 斯科特 迈耶斯 Scott Meyers 详细介绍如下 https stackoverflow com questions 2
  • 将 MongoDB 集合移动到另一个集合的更好方法

    在我的网络抓取项目中 我需要将前一天抓取的数据从mongo collection to mongo his collection 我正在使用此查询来移动数据 for record in collection find his collect
  • 我可以在 .gitignore 文件中包含其他 .gitignore 文件吗? (就像类 C 语言中的 #include 一样)

    我有一些文件 例如vim gitignore SVN gitignore and CVS gitignore 散布在我的硬盘上 我可以简单地将这些 gitignore 文件包含在 gitignore文件在新的 Git 项目中吗 Edit 我
  • 空指针的取消引用

    该错误消息到底意味着什么以及如何修复它 空指针的取消引用 这意味着 self 可以通过 initWithStyle reuseIdentifier 的返回值设为 nil 并且后续对默认值的访问将尝试在 nil 地址处读取 因此取消引用 这肯
  • 如何避免包含类实现文件?

    而不是做 include MyClass cpp 我想要做 include MyClass h 我在网上读到过not这样做被认为是不好的做法 简而言之单独编译 首先 让我们举一些简单的例子 struct ClassDeclaration c
  • Flink时间特性和AutoWatermarkInterval

    在 Apache Flink 中 setAutoWatermarkInterval interval 向下游操作员生成水印 以便他们提前事件时间 如果水印在指定的时间间隔内没有更改 没有事件到达 运行时将不会发出任何水印 另一方面 如果在下
  • 如何将列表附加到 pandas 列、系列?

    假设我有以下数据框 d col1 1 2 col2 3 4 df pd DataFrame data d 我想延长col1带数组xtra 然而这会出错 xtra 3 4 df col1 append xtra 我怎样才能追加xtra to
  • 如何从 Swift 中的 valueChanged 事件获取触摸坐标

    背景 I ve 以前学过的 https stackoverflow com a 34764356 3681880如何使用手势识别器或continueTrackingWithTouch获取当前触摸位置的持续更新 然后使用它们执行如下操作 然而
  • 如何获取CodeAttribute中的属性值

    我写了一个方法来按属性获取属性值 public string GetAttributeValueByNameAttributeAndProperty CodeClass cc string nameAttribute string name
  • 如何在 Jenkins 的 url 中传递 credentialID

    我正在使用这个命令 sh git push https userid passwd innersource com scm raghu demo git 但我想使用 credentialsId f0079d43 9522 4133 9601
  • 在 Ruby 中冻结变量不起作用 [重复]

    这个问题在这里已经有答案了 我正在学习 Ruby 并且在使用时发现了有趣的行为Object freeze带变量的方法 在我冻结一个变量之后 或者Fixnum or Array 我还是可以修改的 这很奇怪 因为就我而言 这不应该发生 而且Ty