繁体   English   中英

Ruby struct creation block无法访问块外的变量

[英]Ruby struct creation block cannot access variable outside the block

在这种情况下,访问Struct创建块内的default变量似乎不起作用:

default = 'test'
A = Struct.new(:a, :b) do
  def initialize(*args)
    super(*args)
    self.b ||= default
  end
end

它抛出以下错误:

'initialize': undefined local variable or method `default' for #<struct A a=2, b=nil> (NameError)

有人可以解释为什么会发生这种情况以及是否有解决方法?

(在Ruby 1.9.3和2.1.2上测试过)

这是因为def关键字启动了新的局部变量范围,因此default局部变量在其中不可见。 解决方法是使用define_method ,因为传递给它的块是闭包:

default = 'test'
A = Struct.new(:a, :b) do
  define_method(:initialize) do |*args|
    super(*args)
    self.b ||= default
  end
end
a = A.new
a.b
# => "test"

default变量超出了initialize方法的范围。 如果你想访问它,我建议你把它变成一个常量(将它重命名为DEFAULT)(除非,你计划在程序运行时更改默认值,但我不明白为什么你这样做,否则不会这样命名):

DEFAULT = 'test'
A = Struct.new(:a, :b) do
  def initialize(*args)
    super(*args)
    self.b ||= DEFAULT
  end
end

a = A.new(1)
p a.b #=> test

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM