当 Ruby 中需要文件时,技术上会发生什么?

2024-03-11

如果我有一个名为app.rb这需要另一个名为foo.rb,Ruby 在幕后做了什么来使定义的常量foo.rb变得可用在app.rb?

来自 Yukihiro Matsumoto 的《Ruby 编程语言》:

使用 load 或 require 加载的文件在不同的新顶级作用域中执行 从调用 load 或 require 的那一个。加载的文件可以看到全局所有 加载时已经定义的变量和常量,但它没有 可以访问启动加载的本地范围。

我很难想象这一点。


例如:

foo.rb:

class Foo
  def hello
    puts "Hello, world!"
  end
end

app.rb:

require_relative "foo"

foo_obj = Foo.new
foo_obj.hello # => "Hello, world!"

p Object.constants.grep /^Foo/ # => [:Foo]

Ruby 做了什么来添加Foo常数进入Object class?


嗯,非常直接,它查找作为参数给出的路径require在当前 $LOAD_PATH 中的所有目录中。如果它在 $LOAD_PATH 的基本路径之一中找到具有该部分路径的文件,则会加载该文件。它还将其标记为已加载 - require 永远不会加载同一个文件两次,如果你第二次需要同一个文件两次基本上是无操作。

关于本地范围,非常简单:

 foo = "x"
 require 'some_file'

那里需要的 some_file (无论是否加载require or load)无权访问该局部变量“foo”。这是not就像代码是在加载/需要时粘贴的一样。相反,它被加载到它自己的本地范围中,不与加载/需要它的上下文共享任何本地变量。

同样,局部变量设置在所需的内部some_file在 require 之后,在其外部也不可见。再说一遍,它是not就像此时代码已被粘贴一样。代码已加载,但在加载/需要时它不与上下文共享任何局部变量访问权限。

您可能预料到,也可能没有想到。就是这样,就是这个意思。

但这仅适用于局部变量。在所需的 some_file 之外定义的常量仍然可用;并且在所需的 some_file 中定义的常量在加载后仍然可用于其他事物。回想一下,Ruby 类实际上是通过常量访问的(SomeClass 是一个常量,它指向实际的类)。因此,这就是为什么 some_file 中定义的常量在被要求或加载后可用于任何其他代码。

除了查看 C 实现(这也超出了我的范围)之外,我不确定如何回答“它做了什么才能使之成为可能”。它只是...将文件加载到当前的 ruby​​ 环境中。这就是让它成为可能的原因。但它加载它就好像它在它自己的局部变量范围内一样,这就是它不共享局部变量的原因。

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

当 Ruby 中需要文件时,技术上会发生什么? 的相关文章

  • Rails - 渲染:目标锚标记的操作?

    我希望像这样使用渲染 render action gt page form 我也尝试过这个 render template gt site page form 那也没用 这个特定页面上的表单位于最底部 如果提交时发生任何错误 我不希望用户被
  • Bundle 说 gem 丢失了 - 但事实并非如此?

    背景 我正在维护contentRuby On Rails 站点 但我确实没有 Rails 的经验 当尝试运行 Rails 服务器时 rails s我明白了 在任何来源中均找不到 activesupport 3 2 0 Run bundle
  • Ruby require 'file' 不起作用,但 require './file' 可以。为什么?

    我有一个充满 ruby 文件的文件夹 当我尝试使用位于同一目录中的另一个文件中的一个文件时require file 我得到一个LoadError但是当我使用require file 一切正常 有人可以向我解释为什么会发生这种情况吗 如果有什
  • 红宝石接球和效率

    catch在 Ruby 中意味着跳出深度嵌套的代码 在 Java 中 例如用Java也可以达到同样的效果try catch用于处理异常 但它被认为是糟糕的解决方案 而且效率非常低 在 Ruby 中 我们有处理异常的方法begin raise
  • 如何使用 net/http 验证 ruby​​ 中的 SSL 证书链

    我如何验证网站的证书 例如https processing ukash com https processing ukash com 在 ruby 中使用 net http https Net HTTP new processing uka
  • 正则表达式的 o 修饰符是什么意思?

    Ruby 正则表达式有一些选项 例如i x m o i例如 意味着忽略大小写 什么是o选项是什么意思 在ri Regexp 它说o意味着执行 仅插值一次 但是当我这样做时 a one b a a two b不改变 它保持 one 我缺少什么
  • 为 RoR 中的每个用户创建新的 URL 路径

    如何在 Ruby on Rails 中实时创建新的 URL 路径 例如 我希望我的用户拥有 name XXX com 或 XXX com name 仅供参考 我在 Heroku 上托管代码 看看 subdomain fu 插件 https
  • ruby on Rails:音频/mp3 内容标题下载

    如何在 ruby rails 中设置下载标题 在 php 中 我为 mp3 下载设置标头 如下所示 header Content Transfer Encoding binary header Content type audio mp3
  • 比较 ruby​​ 哈希值[重复]

    这个问题在这里已经有答案了 可能的重复 如何比较两个哈希值 https stackoverflow com questions 4928789 how do i compare two hashes 我有两个 ruby 哈希值 本质上是模型
  • 子文件夹和关系中的 Rails 模型

    我在自动加载的文件夹中组织了一些轨道模型 config autoload paths Dir Rails root join app models 我可以直接使用所有模型 例如Image first file name 但是当我尝试通过关系
  • 是否有更好的一个衬垫来处理“除非something.new?||something[:key].nil?”

    有没有办法让这个内衬变得更好看 var params key1 key2 unless params blank params key1 blank 就在这里 var params params key1 params key1 key2
  • 如何在不初始化Rails的情况下从schema.rb创建数据库?

    我正在尝试从 schema rb 创建所有表 我使用命令 rake db schema load 但是 这失败了 因为在我的一个初始化程序中 它引用了一个显然不存在的模型 表 因为数据库为空 我可以注释掉这些行 然后再次运行 schema
  • 处理铁路中 STI 子类路线的最佳实践

    我的 Rails 视图和控制器散布着redirect to link to and form for方法调用 有时link to and redirect to它们链接的路径是明确的 例如link to New Person new per
  • 从 Ruby on Rails 应用程序运行 phantomjs

    我有兴趣使用幻影 http www phantomjs org 我想从我的 Ruby on Rails 应用程序运行它 然而 这是一个命令行工具 即我需要运行类似phantomjs rasterize js http raphaeljs c
  • ruby rspec 不能与 simplecov 一起使用

    我安装了 simplecov gem 并添加了 require simplecov SimpleCov start 到spec helper rb文件 现在如果我在some file spec rb文件中包含spec helper rb并尝
  • 将对象转换为哈希,然后将其保存到用户的列

    找不到任何接近我想做的事情 我想将一个对象存储到用户的列中 该列采用数组的形式 postgres def change add column users interest string array true default end 我有另一
  • 使用 HTTPClient 发布嵌套参数(哈希)

    我需要从一个应用程序到另一个应用程序的多部分 http 帖子 其中包括文件附件和嵌套的参数哈希 我尝试使用HTTPClient这适用于文件附件 但是我无法获取以嵌套格式发送的参数 data params Hash new data para
  • 带有 Rake 的 RubyMine 调试器?

    使用 RubyMine 3 0 我设置了 Rake 配置来运行单元测试 然后我设置了一些断点 然后运行 Rake 任务 没有命中断点 测试只是像平常一样执行 然后退出 RubyMine 调试器无法通过 Rake 运行吗 尝试这个 转到运行
  • 为什么递归会出现“堆栈级别太深”?

    我有这个红宝石代码 def get sum n return 0 if n lt 1 n 3 0 n 5 0 n get sum n 1 get sum n 1 continue execution end puts get sum 999
  • 迭代带有小胡子的数组

    如何获取迭代中当前元素的引用 my array p what goes here p my array 我希望我只是忽略了显而易见的事情 根据规范的变更日志 https github com mustache spec blob maste

随机推荐