使用 class_eval 和 instance_eval 访问 Ruby 类变量

2023-12-23

我有以下内容:

class Test
    @@a = 10

    def show_a()
        puts "a: #{@@a}"
    end

    class << self
      @@b = '40'

      def show_b
        puts "b: #{@@b}"
    end
  end
end

为什么以下工作有效:

Test.instance_eval{show_b}
b: 40
=> nil

但我无法访问@@b直接地?

Test.instance_eval{ @@b }
NameError: uninitialized class variable @@b in Object

同样,下面的作品

t = Test.new
t.instance_eval{show_a}
a: 10
=> nil

但以下失败

t.instance_eval{ @@a }
NameError: uninitialized class variable @@a in Object

我不明白为什么我不能直接从类访问类变量instance_eval blocks.


我刚刚在 RubyKaigi 聚会上向 Matz 提出了同样的问题。我已经喝得半醉了,但他却完全清醒,所以你可以将此作为确定的答案。

Anton 是对的 - 无法通过 instance_eval() 访问类变量的原因是“只是因为”。甚至 class_eval() 也有同样的问题(Matz 本人并不完全确定 class_eval() ,直到我告诉他我已经尝试过了)。更具体地说:就作用域而言,类变量更像常量而不是实例变量,因此在访问它们时切换 self(如 instance_eval() 和 class_eval() 所做的那样)不会产生任何差异。

一般来说,完全避免类变量可能是个好主意。

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

使用 class_eval 和 instance_eval 访问 Ruby 类变量 的相关文章

  • 为什么我的 RSpec 规格运行两次?

    我在我的文件中定义了以下 RSpec 1 3 0 任务Rakefile require spec rake spectask Spec Rake SpecTask new spec do spec spec libs lt lt lib l
  • 函数内的多线程变量访问

    我有一个函数可以启动几个线程 它是一个测试函数 其中一个线程会改变变量的状态 由于局部变量不能标记为易失性 因此我假设该方法中的多个线程将始终具有变量的更新状 态 它是否正确 这是示例代码 public void someMethod Mu
  • 使 diff-lcs 的输出可读

    我正在使用 diff lcs gem 输出两个 html 内容体之间的差异 这是示例内容 版本一 p Paragraph one Sentence one p p Paragraph two Another sentence p p Par
  • 运行“bundle install”失败并要求我运行“bundle install”

    事实上 当从我从 git 存储库克隆的现有 Rails 应用程序内部运行时 所有与 gem 相关的命令都会导致相同的错误消息 bundle install Could not find tzinfo 0 3 27 in any of the
  • 从一个方法返回两个变量

    下面的代码如何正确书写 public String toString int position int xOffset int yOffset String postn String format d d position 0 positi
  • 用于将唯一项插入数组的 Ruby 条件

    我知道如果你有一个array并将其引用为array uniq它将返回 没有任何重复项 然而 在本例中 它是一个对象数组 这是正确的 Ruby 语言吗 我希望每个电话都进入 calls数组除非call from与数组中已存在的 call fo
  • Bash 脚本在 for 循环中使用 sed 和变量?

    我正在尝试编写一个 bash 脚本 该脚本需要一些变量 然后使用 grep 对给定文件搜索进行查找 替换 以获取包含该字符串的文件列表 我认为我遇到的问题是在 sed 中看到变量我不确定它可能是什么 if searchFiles a old
  • ruby Sequel gem - 如何使用 pg_array 扩展查询数组

    我正在使用pg array http sequel jeremyevans net rdoc plugins files lib sequel extensions pg array rb html扩展和续集版本 4 1 1 我添加了这样的
  • 使用 gem 添加辅助方法

    我找到了很多有关添加表单辅助方法的信息 请参阅我的其他问题之一 但我找不到有关添加辅助方法的任何信息 就好像它们是在application helper rb 我尝试过复制application helper rb从 Rails 应用程序到
  • 使用自定义令牌进行 Firebase 身份验证

    我有一个 firebase 项目 我试图从我的 Rails 服务器进行身份验证 按照文档上的说明使用 ruby jwt 库创建自定义令牌 但我不断收到相同的错误 auth invalid custom token 自定义令牌格式不正确 请检
  • 退出无法在 Heroku 上工作 - 使用 Devise gem 和 Rails 4

    我刚刚对使用 Devise 进行身份验证的 Rails 4 应用程序进行了初始部署到 Heroku 注销可以在本地进行 但 Heroku 返回错误 您正在查找的页面不存在 并且不会注销用户 根据 Heroku 日志和 Google SO 搜
  • 对于所有 mime 类型,仅respond_to format.js

    我有一个响应 format js 的控制器 但是 大多数请求假设旧的 format html 仍然存在并抛出 404 异常 如何捕获控制器上的所有 MIME 请求并将它们仅重定向到 format js 这是当前控制器的操作 def sear
  • 如何在 jQuery.ui.autocomplete 中的自动完成弹出窗口下方添加所有搜索的链接?

    我有使用 jQuery UI 自动完成插件的搜索建议自动完成功能 http jqueryui com autocomplete http jqueryui com autocomplete 但是如何添加结果弹出项目的底部 其行为类似于 Qu
  • AngularJS:从控制器内读取路由参数

    如何在 AngularJS 控制器中读取 URL 中的参数 假设我有一个像这样的网址http localhost var value我希望将该值存储在控制器内的变量中 var value URL 我尝试过使用 routeParams val
  • C++ 中的“助手”函数

    在重构一些旧代码时 我删除了许多实际上应该是静态的公共方法 因为它们a 不操作任何成员数据或调用任何其他成员函数 b 因为它们可能在其他地方有用 这让我思考将 辅助 功能组合在一起的最佳方法 Java C 方法是使用带有私有构造函数的静态函
  • 用于从 Open3.popen3 标准输出中提取值的正则表达式

    如何获取外部命令的输出并从中提取值 我有这样的事情 stdin stdout stderr wait thr Open3 popen3 path foobar configfile if exit 0 wait thr value to s
  • ActiveRecord::Enum - PG::InvalidTextRepresentation:错误:整数输入语法无效:

    我遇到了一个奇怪的错误 希望有人能指出我正确的方向 我有一个名为 组织 的模型和一个名为 组织 的属性department 请参阅下面的架构摘录 t integer department default 0 在我的模型内部已经定义了这个属性
  • 将用户输入转换为整数

    所以我有一个用户可以输入价格的表格 我正在尝试创建一个 before validation 来规范化数据 如果用户放置 则剪裁它 before validation do unless self price blank then self
  • 如何使用 Rspec 来测试使用 Paperclip 的模型是否正在验证上传文件的大小?

    该模型 class Attachment lt ActiveRecord Base belongs to narrative attr accessible description user id narrative id has atta
  • RVM 要求错误

    我安装了 OS X Mavericks 并且正在尝试运行rvm requirements在终端中 它给了我这个错误 Installing required packages autoconf automake libtool pkgconf

随机推荐

  • 如何在Python中创建一组参数化函数? [复制]

    这个问题在这里已经有答案了 我正在尝试创建一系列函数 并通过 shift 参数进行参数化 考虑下面的代码 我希望 for 循环创建一组函数 每个函数都会改变 不同数量的争论 Python 3 code N 5 fns for idx in
  • 如何检查数组中是否可以求和?

    给定一个数组N整数 检查是否可以获得总和S 通过选择数组的一些 或不选择 元素并添加它们 我尝试使用贪婪方法解决这个问题 首先对数组进行排序 然后越来越接近总和 然而它不起作用 谁能告诉我应该如何解决这个问题 t int input for
  • iPhone:NSURLRequest CachePolicy 设置之间的性能差异

    使用时NSURL请求 http developer apple com iphone library documentation Cocoa Reference Foundation Classes NSURLRequest Class R
  • 什么是红/绿测试?

    我相信我已经知道答案 但我不是 100 确定 所以只是一个简单的问题 红 绿测试实际上意味着什么 我将其理解为 首先编写测试 以便它们全部失败 全部红色 然后编写代码并观察每个测试如何变成绿色 当所有测试都变成绿色时 就没事了 我在Scot
  • npm 包中的二进制文件

    我尝试创建一个 npm 包 它可以作为 shell 中的命令启动 我有package json name myapp version 0 0 6 dependencies async watch node promise rmdir sho
  • Java中的内部静态类

    使用内部静态类有什么好处 与其他选项相比 我应该在哪些方面更喜欢它 它的内存是如何分配的 如果内部类是静态的 则不需要外部类的实例来实例化它 如果内部类是公共的 那么它基本上只是一种名称范围技术 用于强调该类 属于 外部类这一事实 但是 如
  • 如何声明对本机 .so 库的依赖以进行测试?

    我在 Akka 中有一个生产应用程序 我从以下选项开始 Djava library path native with native包含库的目录libsigar amd64 linux so 一切都很好 当我打字时sbt test我面临以下错
  • ImageMagick Convert 在命令行中工作,但不能通过 PHP exec()

    我正在使用 PHPexec 使用 ImagicMagick 转换图像convert 这是在 CentOS 服务器上运行的 exec convert http www google com images srpr logo3w png jpg
  • 如何设置定时器

    有什么办法可以将计时器设置为 60 秒xor ah ah Enter Again xor ah ah I should put 60 seconds here int 16h The user should press S before 6
  • 具有 JavaScript 依赖项的聚合物元素

    我已经创建了用于渲染 markdown 的 Polymer 元素 https github com robdodson mark down它使用 Marked js 库 我想知道 加载其依赖项的推荐方式是什么 我应该只使用脚本标签吗 或者将
  • Rails 日期与 json

    我正在实施一个Facebook应用及使用AJAX JSON 但是 那JSON返回的结构具有以下格式2010 05 30T06 14 00Z 我正在打电话Game all to json在控制器动作中 如何将它们转换为正常的日期格式 从服务器
  • 在隐藏字段中传递帖子 ID 的值

    这与我的另一个问题是一致的 当我提交属于特定帖子的新评论时 试图获取正确的 post id form html erb 如果没有看到更多代码 很难确切地知道你在做什么 但我的猜测是 post 实例变量已使用设置 post Post find
  • 从 SQLite Blob 创建 Drawable 时出现问题

    我将图像文件作为 blob 缓存在 SQLite 数据库中 我在另一个平台上有一个类似的应用程序 它对相同的图像文件执行相同的操作 两个平台上的数据库报告相同图像的完全相同的大小 所以我认为 但不能保证图像数据完好无损地进入数据库 但是当我
  • Python ASCII 到二进制

    是否有一个内置函数可以将 ASCII 转换为二进制 例如 将 P 转换为 01010000 我正在使用Python 2 6 6 两个人在一起怎么样 bin ord P 0b1010000
  • 使用 HighCharts 和 DotNet.HighCharts 来“玩”多个系列

    我有一组使用 VB NET 和 DotNet HighCharts 创建的系列 Dim SeriesList4As New List Of Series stfipsList4 Count 我想要发生的是类似的事情http jsfiddle
  • 删除navigationItem.titleView后恢复navigationItem.title

    我的应用程序有 2 个选项卡 tabA and tabB 根据我设置的位置navigationItem titleView of tabB to a UIImageView when viewWillAppear 叫做 默认行为tabB就是
  • Android:DOM vs SAX vs XMLPullParser 解析?

    我正在使用 SAX 解析器解析 XML 文档 我想知道与哪个合作更好更快DOM SAX解析器 or XMLPull解析器 这取决于你在做什么 如果你有非常大的文件 那么你应该使用 SAX 解析器 因为它会触发事件并释放它们 内存中不会存储任
  • 响应内容必须是实现 __toString() 的字符串或对象,给定“boolean”。在拉拉维尔

    响应内容必须是实现 toString 的字符串或对象 给定 boolean 这是我的代码 Route get user ip function Request request ip request gt ip return ip retur
  • 在 mac osx lion 中安装(构建)matplotlib

    我安装了 pynum 和 scipy 在带有 python 2 7 的 osx Lion 上 但是当我尝试构建 matplotlib 时 git clone https github com matplotlib matplotlib gi
  • 使用 class_eval 和 instance_eval 访问 Ruby 类变量

    我有以下内容 class Test a 10 def show a puts a a end class lt lt self b 40 def show b puts b b end end end 为什么以下工作有效 Test inst