Я не думаю, что вы хотите, возможно. Вы каким-то образом пытаетесь получить доступ к внутреннему состоянию класса Array
, что не только невозможно, потому что в большинстве реализаций эти внутренние компоненты скрыты во время выполнения C / C ++ / Java / .NET / Objective-C / ABAP, но также просто плохая идея и плохой объектно-ориентированный дизайн.
Дело в том, что Messages
на самом деле не Array
, поэтому он не должен наследоваться от Array
. Скажите мне: действительно ли вы на 100% уверены, что ваш Messages
класс способен добросовестно выполнять контракты всех 81 методов на Array
? И что assoc
, rassoc
, rindex
и transpose
даже означают применительно к Messages
?
Вам было бы намного лучше использовать делегирование вместо наследования здесь. Это дает вам красивую именованную сущность, которую вы можете передать xml_accessor
:
require 'forwardable'
require 'roxml'
class Messages
extend Forwardable
include ROXML
class << self; alias_method :[], :new end
xml_reader :messages, :as => [Message]
def initialize(*messages) @messages = messages end
def_delegators :messages, :length, :<<
end
Примечание: я также изменил здесь несколько других вещей. Например, я лично считаю, что объект должен быть действительным и пригодным для использования после его создания. В вашей версии кода Message
в основном недействителен после его создания и становится действительным только после вызова сеттеров type=
, code=
и body=
:
class Message
include ROXML
class << self; alias_method :[], :new end
xml_reader :type, :body
xml_reader :code, :as => Integer
def initialize(type=nil, code=nil, body=nil)
@type, @code, @body = case opts = type
when Hash
opts[:type], opts[:code], opts[:body]
else
type, code, body
end
end
end
Вот немного расширенный пример использования:
msgs = Messages[Message['error', 1234, 'This is a test message.'], Message[]]
msgs << Message[
type: 'warning',
code: 4815162342,
body: 'This is another test message.'
]
puts msgs.to_xml
# => <messages>
# => <message>
# => <type>error</type>
# => <body>This is a test message.</body>
# => <code>1234</code>
# => </message>
# => <message/>
# => <message>
# => <type>warning</type>
# => <body>This is another test message.</body>
# => <code>4815162342</code>
# => </message>
# => </messages>