gpt4 book ai didi

ruby - 从 Struct 子类化与使用 attr_accessible

转载 作者:太空宇宙 更新时间:2023-11-03 17:38:19 24 4
gpt4 key购买 nike

在 Ruby 1.8.6 中,我可以写 class PerformableMethod < Struct.new(:object, :method, :args)

现在在 Ruby 1.9.3 中,会抛出一个错误:superclass mismatch for class PerformableMethod

如果我将代码更改为:

class PerformableMethod
attr_accessor :object, :method_name, :args

但为什么结构不起作用?

最佳答案

类名在 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 的父类(super class)。向 Struct.new() 提供类名没有帮助,如第二个代码块所示;这只是添加了关于重新定义常量的警告,然后无论如何打开类都会失败。

避免异常的唯一方法是将您的 Struct 存储在您控制的某个地方的常量中,并确保在重新加载文件时不要更改该常量。

关于ruby - 从 Struct 子类化与使用 attr_accessible,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10759122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com