【问题标题】:Variable exporting in RubyRuby 中的变量导出
【发布时间】:2022-01-25 07:45:05
【问题描述】:

我是 Ruby 的新手,所以请您向我解释一件事。这是我的代码文件:

class You
  def method
    puts "are the best"
  end
end

CONST = "const value"
var = "var value"

我在另一个文件或irb 中需要它。之后,我可以访问除var 之外的所有声明名称。据我了解,Ruby 通过大写来区分常量和变量。但是为什么没有导出变量呢?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    事实上,Ruby 中没有顶级声明。所有执行都在Object 类的上下文中执行(它也是Ruby 中每个类的基类),因此每个顶级声明也是Object 类的私有成员。实例变量具有 at-sign 前缀 (@),因此您的变量 var 甚至不是实例变量,它只是局部变量,在其范围之外无法访问。此外,Ruby 中的实例变量也始终是私有的。

    相反,您可以将其设为实例变量并为其定义 getter 和(可选)setter:

    # file.rb
    @var = "var value"
    
    def var
      @var
    end
    
    def var=(val)
      @var = val
    end
    

    然后:

    $ irb -r ./file.rb
    irb(main):001:0> var
    => "var value"
    irb(main):002:0> var = "another var value"
    => "another var value"
    irb(main):003:0> var
    => "another var value"
    

    【讨论】:

    • @var 是一个 instance 变量,@@var 是一个类变量。
    • @muistooshort 当然。固定的。感谢您的评论。 :)
    【解决方案2】:

    不会导出局部变量,因为这就是 require 的工作方式:

    加载的源文件中的任何常量或全局变量都将在调用程序的全局命名空间中可用。但是,局部变量不会传播到加载环境。

    常量(包括 class You 中的 You)并且是全局范围的,因为在没有明确的导出机制的情况下,这通常是您想要的。

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 2011-10-24
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多