class Cat
SUPERSTARS = [Cat.new('John'), Cat.new('Alfred')]
attr_accessor :name
def initialize(name)
@name = name
end
end
我收到错误
ArgumentError:参数数量错误(1表示0)
因为initialize
没有再次定义。
如果我把定义放在最后:
class Cat
attr_accessor :name
def initialize(name)
@name = name
end
SUPERSTARS = [Cat.new('John'), Cat.new('Alfred')]
end
它有效。
是否可以在文件顶部保持常量声明?
答案 0 :(得分:1)
我想,你可以使用这个技巧:
class Cat
def self.const_missing(name)
[Cat.new('John'), Cat.new('Alfred')] if name == :SUPERSTARS
end
attr_accessor :name
def initialize(name)
@name = name
end
end
答案 1 :(得分:0)
问题是类定义只是在达到定义时执行的代码。这就像询问您是否可以访问尚未定义的局部变量的值一样。
可能的解决方法是延迟常量的求值,直到执行类体。请注意,它并不值得,它显示了一个不应该在实践中使用的工作解决方案:
app:layout_collapseMode="pin"
答案 2 :(得分:0)
Avdi Grimm在他的免费剧集rubytapas中称"Barewords"建议你不要直接使用常数。而是将它们包装在一个方法中。当你有一个方法时,你甚至不需要常数(在ruby中它实际上不是常量)。
所以,你可以这样做:
class Cat
def self.superstars
@superstars ||= [Cat.new('John'), Cat.new('Alfred')]
end
attr_accessor :name
def initialize(name)
@name = name
end
end
唯一的区别是您现在称之为Cat.superstars
而不是Cat::SUPERSTARS
。您的代码现在可以工作,看起来也更好!我称之为双赢。 :)