如何在ruby方法中扩展ruby mainspace变量的范围

如何在ruby方法中扩展ruby mainspace变量的范围,ruby,scope,Ruby,Scope,以下代码将引发 在e中:对于main:Object(namererror),未定义的局部变量或方法a) 如何在e中访问a?最好只使用lambda或实例变量。但是,假设您真的想这样做,您可以使用#define_方法: a = '0' define_method(:e) do puts a end e 与def关键字不同,define\u方法不是范围门,因此它允许您查看外部局部变量。如果您只使用lambda或实例变量,效果会更好。但是,假设您真的想这样做,您可以使用#define_方法: a

以下代码将引发

e
中:对于main:Object(
namererror
),未定义的局部变量或方法
a


如何在
e
中访问
a

最好只使用lambda或实例变量。但是,假设您真的想这样做,您可以使用
#define_方法

a = '0'
define_method(:e) do
  puts a
end
e

def
关键字不同,
define\u方法
不是范围门,因此它允许您查看外部局部变量。

如果您只使用lambda或实例变量,效果会更好。但是,假设您真的想这样做,您可以使用
#define_方法

a = '0'
define_method(:e) do
  puts a
end
e

def
关键字不同,
define\u方法
不是作用域门,因此它允许您查看外部局部变量。

您可以为方法定义一个参数,然后在调用它时传入
a
作为参数。括号是可选的,尽管在这里它们很重要,可以显示参数是如何定义的,以及如何将
a
作为参数传递

def e(parameter)
  puts parameter
end

a = '0'
p e(a)
#'0'

您可以为方法定义一个参数,然后在调用它时传入
a
作为参数。括号是可选的,尽管在这里它们很重要,可以显示参数是如何定义的,以及如何将
a
作为参数传递

def e(parameter)
  puts parameter
end

a = '0'
p e(a)
#'0'

例如,将其设为全局变量:

$a = '0'
def e
  puts $a
end
e
#⇒ "0"

E、 g.使其成为全局变量:

$a = '0'
def e
  puts $a
end
e
#⇒ "0"

值得一提的是,实际发生的是
def
声明了新的作用域,它不从父上下文派生绑定。这就是lambda和methods之间的主要区别,也是为什么
define_method
中的lambda和block都可以工作的原因:它们是闭包,因此派生上下文。值得一提的是,实际发生的是
def
声明了新的范围,而不是从父上下文派生绑定。这就是lambda和methods之间的主要区别,也是为什么
define\u method
中的lambda和block都可以工作的原因:它们是闭包,因此派生上下文。请不要将此答案标记为正确。这是这里最糟糕的一个。请不要把这个答案标记为正确。这是这里最糟糕的一次。