类名是在1.9和2.0也可选。问题是这样的:
> Struct.new(:asdf, :qwer) == Struct.new(:asdf, :qwer)
=> false
即使您为Struct
类名:
> Struct.new("Zxcv", :asdf, :qwer) == Struct.new("Zxcv", :asdf, :qwer)
(irb):22: warning: redefining constant Struct::Zxcv
=> false
这意味着,如果你有这样的文件,您加载或要求:
class MyClass < Struct.new(:qwer, :asdf)
def some_method
puts "blah"
end
end
...然后如果你再次加载 - 也许是因为你改变了一些东西,而你想在不重新启动irb的情况下尝试一下,或者你正在开发模式下运行Rails,并在每个请求上重新加载类 - 那么你得到的异常:
TypeError: superclass mismatch for class MyClass
...因为每当你的类定义运行时,它正在申报新Struct
为MyClass
超品牌。提供类名到Struct.new()
没有帮助,如第二个代码块所示;这只是增加了一个关于重新定义常量的警告,然后打开该类失败。
避免异常的唯一方法是将Struct
保存在您控制的某个常量中,并确保在重新加载文件时不更改该常量。
这将打开'Struct'的单例类。这与问题中的说法不一样。 – clacke