ruby - 如何在 ruby​​ 脚本之间传递变量?

标签 ruby

与实际的代码解决方案相比,我最感兴趣的是理论。我怎样才能让一个主要的 ruby​​ 脚本调用其他脚本并在彼此之间共享变量?我有点困惑..我是否需要使用环境变量、 session 变量、方法、模型、 Controller ,最好的方法是什么!!?

最佳答案

假设您有一个 script.rb,其中包含:

$var = :value
def get; A end
load 'another_script.rb'
get  # Will it succeed?

当您运行 ruby script.rb 时,您会生成一个 Ruby 进程,该进程将读取 script.rb 的内容并执行每一行。 Ruby 解释器有一个执行状态,它包含对象数据、引用它们的变量、它们所属的范围、您当前使用的方法等信息。

当解释器读取 $var = :value 行时,它会修改自己的状态。它存储一个引用新创建的符号对象的全局变量。接下来,它定义了一个方法,该方法将返回 A 常量引用的值。此时调用它会引发 NameError,因为常量不存在。当它到达 load 'another_script.rb' 行时,它类似于运行 ruby another_script.rb,只是没有启动第二个进程。脚本的内容在相同的执行上下文中被读取和解释。

假设 another_script.rb 包含以下内容:

$var = :changed
class A; end

以前引用:value 符号的$var 变量现在将引用:changed 符号。然后,将创建一个 Class 对象并将其分配给新的 A 常量。

加载此脚本后,对 get 的调用将成功。另一个含义是顺序很重要。例如:

load 'another_script.rb'
$var = :value

无论 another_script.rb$var 设置为什么都将丢失,因为它将在完成执行后立即被覆盖。

无论您loadrequireeval 有多少脚本,只要它们运行在同一个进程上,它们就会< em>总是共享相同的数据。 Only local variables will not be shared between files .当您想在两个不同 Ruby 解释器之间共享数据时,事情就变得复杂了:

ruby script.rb &
ruby another_script.rb &

在这种情况下,您必须使用 inter-process communication .

关于ruby - 如何在 ruby​​ 脚本之间传递变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10430455/

相关文章:

ruby - 如何让Ruby部分解析源码?

ruby - 遍历实例变量,如何更改它们?

ruby - 如何使用 Mongoid 在 MongoDB 中自动创建关联记录?

ruby-on-rails - Rails 中 Controller 的嵌套命名空间

ruby-on-rails - View 和 Controller 外部的 Rails Engine RouteProxy

ruby - 为什么我的代码在使用哈希符号而不是哈希字符串时会崩溃?

ruby - 在方法中访问局部变量

ruby - Ruby 中 Math Power (**) 的反面是什么?

ruby-on-rails - 如何对三元运算符使用多重赋值?

ruby-on-rails - 如何让 capybara 找到快速出现和消失的元素(加载微调器)