Ruby 将变量添加到main

Ruby 将变量添加到main,ruby,metaprogramming,Ruby,Metaprogramming,对于我正在处理的gem,我需要向main添加一个变量,最好是一个局部变量,但实例也可以。我一直在尝试使用Object.instance\u variable\u set,但没有取得任何进展。我怎样才能做到这一点 澄清 我需要从main中的模块设置实例变量 以下是我的情况: module MyGem::Submodule def self.add_variable_to_main Object.instance_variable_set(:@var,"value")

对于我正在处理的gem,我需要向main添加一个变量,最好是一个局部变量,但实例也可以。我一直在尝试使用
Object.instance\u variable\u set
,但没有取得任何进展。我怎样才能做到这一点

澄清

我需要从
main
中的模块设置实例变量

以下是我的情况:

module MyGem::Submodule
    def self.add_variable_to_main
        Object.instance_variable_set(:@var,"value")
    end
    def self.recieve_variable_from_main
        Object.instance_variable_get(:@var)
    end
    def self.store_block
        @@block=&block
    end
    def self.call_block
        add_variable_to_main
        @@block.call
        puts recieve_variable_from_main
    end
end

class Object
    include MyGem::Submodule
end

store_block do
    @var = "Var is #{@var}"
end

call_block

我还问了同样的问题,它有额外的细节。

main
是一个对象,对象不能有局部变量。局部变量属于词法范围,而不是对象

您只需在
main
的上下文中为实例变量赋值即可:

@ivar = 42
现在,
main
有一个实例变量
@ivar
,其值为
42

工作原理相同:

instance_variable_set(:@ivar, 42)
如果您不在
main
的上下文中,您可以通过全局常量访问顶级,通过访问
main
对象本身,因为
main
是隐式接收器,即顶级的
self

module Foo
  TOPLEVEL_BINDING.receiver.instance_variable_set(:@ivar, 42)
end

@ivar # => 42

main
是一个对象,对象不能有局部变量。局部变量属于词法范围,而不是对象

您只需在
main
的上下文中为实例变量赋值即可:

@ivar = 42
现在,
main
有一个实例变量
@ivar
,其值为
42

工作原理相同:

instance_variable_set(:@ivar, 42)
如果您不在
main
的上下文中,您可以通过全局常量访问顶级,通过访问
main
对象本身,因为
main
是隐式接收器,即顶级的
self

module Foo
  TOPLEVEL_BINDING.receiver.instance_variable_set(:@ivar, 42)
end

@ivar # => 42

有一个常量
TOPLEVEL\u BINDING
,用于存储
main
的绑定。您可以在具有该绑定的任何位置将实例变量设置为
main

module Foo
  TOPLEVEL_BINDING.eval '@foo = :bar'
end

@foo  #=> :bar

有一个常量
TOPLEVEL\u BINDING
,用于存储
main
的绑定。您可以在具有该绑定的任何位置将实例变量设置为
main

module Foo
  TOPLEVEL_BINDING.eval '@foo = :bar'
end

@foo  #=> :bar

这并不能解决我的问题,因为我的问题是我必须从
main
中的一个模块设置它,因为这是一个gem,我需要在后台为用户设置一个变量,所以这对我不起作用。我想这会起作用,我只是不接受答案,直到我自己做了更多的研究。这并不能解决我的问题,因为我的问题是我必须从
main
中的一个模块设置它,因为这是一个gem,我需要在后台为用户设置一个变量,所以这对我不起作用。我认为这会起作用,在我自己做更多的研究之前,我不会接受答案。
main
TOPLEVEL\u BINDING
上下文吗你真的确定这是你想要添加的吗?请解释一个全局对象或顶级常量不容易处理的用例。gem应该是一个封装的库,对顶层进行变异可能会产生意想不到的结果。@engineersmnky在我的gem中,我需要在main中设置一个可访问的变量,但通过对象进行设置也同样有效。你能写一个解释缺点和好的选择的答案吗?你能提供一个你希望实现的例子吗?我想你误解了
main
@engineerinersnky的概念。我已经添加了一个示例,谢谢你的支持,我真的很感谢你的帮助。这个变量将如何改变或改变?如何使用此变量?就像我说的,gem是用来封装的,所以我们需要理解为什么需要这样做。如果变量永远不会更改,则可以使用一个常量,如
::variable
,前导冒号将其置于顶级命名空间中。如果它将改变,您可能会使用全局变量,如
$变量
前导的
$
将使其全局可用。如果不理解你为什么需要这个(我不确定你是否真的需要这个)背后的概念,我无法形成一个比下面列出的答案更合适的答案。
main
TOPLEVEL\u BINDING
上下文吗?你真的确定这是你想要添加这个的地方吗?请解释一个全局对象或顶级常量不容易处理的用例。gem应该是一个封装的库,对顶层进行变异可能会产生意想不到的结果。@engineersmnky在我的gem中,我需要在main中设置一个可访问的变量,但通过对象进行设置也同样有效。你能写一个解释缺点和好的选择的答案吗?你能提供一个你希望实现的例子吗?我想你误解了
main
@engineerinersnky的概念。我已经添加了一个示例,谢谢你的支持,我真的很感谢你的帮助。这个变量将如何改变或改变?如何使用此变量?就像我说的,gem是用来封装的,所以我们需要理解为什么需要这样做。如果变量永远不会更改,则可以使用一个常量,如
::variable
,前导冒号将其置于顶级命名空间中。如果它将改变,您可能会使用全局变量,如
$变量
前导的
$
将使其全局可用。如果不理解你为什么需要这个(我不确定你是否真的需要这个)背后的概念,我无法形成一个比下面列出的答案更合适的答案。