首页 > 解决方案 > 如何将局部变量从模块导入到Ruby中的另一个类

问题描述

我是 Ruby 的新手。

我有一种情况,我在运行时在模块中生成一些值,我需要在另一个类中访问它。最好的方法是什么?下面我给出了我的目录结构和一个虚拟代码。我想将 module.rb 中的“local_variable_a”导入 someclass.rb。

目录结构:

文件夹_A -> 文件夹_B -> 文件夹_C -> 模块.rb

Folder_A -> Folder_D -> someclass.rb

模块.rb

Module First
  Module Second
    def some_method
      local_variable_a = some_value
    end
  end
end    

某类.rb

class Example
  def initialize(example)
    @example = example
  end

  def another_method
    local_variable_a = some_value  //import from module.rb
  end

标签: rubymetaprogramminglocal-variables

解决方案


Ruby 中的局部变量就是这样。它们是存在于定义它们的词法范围(方法、块等)中的词法变量。一旦该范围关闭,它们就会被垃圾收集。

例如,在这里分配局部变量是完全没有意义的,因为它的垃圾会在方法完成后立即收集:

def another_method
  local_variable_a = some_value  //import from module.rb
end

Ruby 中没有变量导入功能,因为它基于使用消息传递方法。要“导入”变量,您将它们作为输入传递给方法 - “导出”变量,您可以从方法中返回它们。

如果您希望模块公开任何内容,您可以通过以下方法进行:

module Foo
   # this is an instance variable that belongs to the module
  @baz = "Hello World"
  def self.bar
    @baz
  end
end

puts Foo.bar

如果您想让一个模块定义一组实例变量,那么只需创建一个您从初始化程序调用的实例方法:

module TimeStamps
  def set_timestamps!
    @initialized_at = Time.now
  end

  def initialized_at 
    @initialized_at
  end
end

class Bar
  include TimeStamps

  def initialize
    # ...
    set_timestamps!
  end
end

Bar.new.initialized_at
# => 2021-06-18 12:44:32.357627871 +0200

推荐阅读