在常量声明中使用当前类

时间:2017-03-22 08:30:54

标签: ruby

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

它有效。

是否可以在文件顶部保持常量声明?

3 个答案:

答案 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。您的代码现在可以工作,看起来也更好!我称之为双赢。 :)