【问题标题】:Is the "top level context object" in Ruby like the global context in JavaScript?Ruby 中的“顶级上下文对象”是否类似于 JavaScript 中的全局上下文?
【发布时间】:2023-03-20 08:35:02
【问题描述】:

假设我编写了一个没有类定义的 Ruby 脚本。我仍然可以创建类变量和类级实例变量:

@@var = "class variable!";
@var = "class instance variable!";

puts @@var;
puts @var;

这些变量属于*上下文对象。

这个*上下文对象是否类似于global context in JavaScript,因为它可以用作一种*命名空间?例如,有没有办法在 Ruby 中使用“*上下文对象”来做这样的事情?

var arrStore1 = new Ext.data.ArrayStore({/*...*/});
/* same call again, using the global context object */
var global = window;
var arrStore2 = new global.Ext.data.ArrayStore({/*...*/});

【问题讨论】:

  • 您可以但可能不应该。主上下文不应该以这种方式被实例变量污染。
  • @tadman - 我在问更多它是否充当根命名空间,这将允许使用该变量访问其他类; self.Dir.pwd 什么的。
  • self.Dir 不应该工作。 Dir 是一个根命名空间条目,就像任何其他类一样。通常实例变量用于类和类的实例only。看到它们用于其他目的是非常不正常的。 JavaScript 与 Ruby 有不同的上下文和作用域概念。此外,@var 对根命名空间是私有的,其他人无法访问,因为它是 JavaScript 变量,因为实例变量对其所有者始终是私有的。

标签: ruby global-object


【解决方案1】:

*对象与任何其他 ruby​​ 对象一样。您可以在其中包含模块,它可以具有实例变量。但这并不是真正的全球背景。

有关更多详细信息,请参阅 SO:What is "main" in Ruby?

【讨论】:

    【解决方案2】:

    几乎总是最好创建某种*命名空间条目并将您的全局或准全局变量放入其中:

    module GlobalOptions
      def self.option
        @option
      end
    
      def self.option=(value)
        @option = value
      end
    end
    
    GlobalOptions.option = :foo
    GlobalOptions.option
    # => :foo
    

    在 Rails 内部,您有 mattr_accessor,它可以自动为您生成这些。

    【讨论】:

      最近更新 更多