Почему Ruby Builder:: XmlMarkup добавляет тег проверки в xml?

Я пытаюсь создать Builder:: XMLMarkup для создания некоторого xml и он добавляет пустой элемент в мой xml.

Почему он это делает и как его остановить?

xml = Builder::XmlMarkup.new
=> <inspect/> 

Ответ 1

Builder реализует версию method_missing, которая добавляет теги, заданные именем вызова метода.

Предполагая, что вы играете на консоли irb (или rails), поведение по умолчанию irb при оценке выражения (например, Builder::XmlMarkup.new) заключается в вызове inspect на нем, чтобы создать строку для показа вам, В случае компоновщика inspect не является обычным рубиновым inspect - он проходит до method_missing и добавляет тег.

Это произойдет только при интерактивном воспроизведении рубина. Вы можете делать такие вещи, как

xml = Builder::XmlMarkup.new; false

Здесь результат выражения false, поэтому irb вызывает inspect на этом и оставляет объект вашего строителя самостоятельно.

Это может быть неудобно продолжать делать это постоянно. Если вы делаете

xml = Builder::XmlMarkup.new; false
def xml.inspect; target!; end

то xml все равно будет объектом-строителем, отображающим его содержимое при проверке irb. Вы не сможете создавать теги под названием inspect (кроме использования tag!), но это, как правило, небольшое неудобство.

Ответ 2

Если вы все еще хотите увидеть результат:

xml = Builder::XmlMarkup.new; xml.target!