Ruby 将变量添加到main
对于我正在处理的gem,我需要向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")
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
,前导冒号将其置于顶级命名空间中。如果它将改变,您可能会使用全局变量,如$变量
前导的$
将使其全局可用。如果不理解你为什么需要这个(我不确定你是否真的需要这个)背后的概念,我无法形成一个比下面列出的答案更合适的答案。