Ruby类实例变量和继承的疑问?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

我有一个Ruby类叫LibraryItem。我想与此类的每个实例关联一组属性。这个数组很长,看起来像

['title', 'authors', 'location', ...]

这是我的:

class LibraryItem < Object
  class << self; attr_accessor :attributes; end
  @attributes = ['title', 'authors', 'location',]
end

class LibraryBook < LibraryItem
  @attributes.push('ISBN', 'pages')
end

这不起作用。收到错误

undefined method `push' for nil:NilClass

正常应该输出这样的东西

puts LibraryItem.attributes 
puts LibraryBook.attributes
['title', 'authors', 'location']
['title', 'authors', 'location', 'ISBN', 'pages']

提问于
用户回答回答于

在这种情况下,以下应该可以:

class Foo
    ATTRS = ['title', 'authors', 'location']
    def attributes
        ATTRS
    end
end

class Bar < Foo
    ATTRS = ['ISBN', 'pages']
    def attributes
        super + ATTRS
    end
end

用户回答回答于

另一个解决方案是使用继承钩:

class LibraryItem < Object
  class << self
    attr_accessor :attributes
    def inherit_attributes(attrs)
      @attributes ||= []
      @attributes.concat attrs
    end

    def inherited(sublass)
      sublass.inherit_attributes(@attributes)
    end
  end
  @attributes = ['title', 'authors', 'location',]
end

class LibraryBook < LibraryItem
  @attributes.push('ISBN', 'pages')
end

扫码关注云+社区