与实际的代码解决方案相比,我最感兴趣的是理论。我怎样才能让一个主要的 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
设置为什么都将丢失,因为它将在完成执行后立即被覆盖。
无论您load
、require
或eval
有多少脚本,只要它们运行在同一个进程上,它们就会< 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/