Динамические элементы XML Builder - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь запустить программу и динамически назначать элементы, используя методы компоновщика. Проходя через мою процедуру, я пытаюсь динамически назначать элементы, используя переменные. Я попытался несколько вариантов, чтобы эта переменная передавалась хотя бы в элемент, но она не работает.

Я изначально начал с построения моих данных в хэше, однако в моей полной процедуре у меня есть дубликаты ключей, поэтому у меня былоперейти к чему-то более прямому.

можно ли достичь желаемого эффекта, используя строитель

require 'builder'
x = Builder::XmlMarkup.new(:target => $stdout, :indent => 1)
x.instruct!
x.character do
  stats = "health, mana, armor"
  stats.split(",").each do |stat|
    key = stat.strip.downcase
    value = rand()
    x.key value
  end #end do
end #end do

Вывод

C:\Projects>ruby test.rb
<?xml version="1.0" encoding="UTF-8"?>
<character>
 <key>0.1405191069855357</key>
 <key>0.3484226234753265</key>
 <key>0.4658284443108096</key>
</character>

Желаемый вывод

C:\Projects>ruby test.rb
<?xml version="1.0" encoding="UTF-8"?>
<character>
 <health>0.1405191069855357</health>
 <mana>0.3484226234753265</mana>
 <armor>0.4658284443108096</armor>
</character>

1 Ответ

0 голосов
/ 04 ноября 2019
require 'builder'
x = Builder::XmlMarkup.new(:target => $stdout, :indent => 1)
x.instruct!
x.character do
  stats = "health, mana, armor"
  stats.split(",").each do |stat|
    key = stat.strip.downcase
    value = rand()
    x.__send__(key, value)
  end
end

Вы можете использовать метод объекта ruby ​​send или его псевдоним __send__. Но так как send слово также может использоваться для его ключа, только send предоставляется для использования объекту. Документ для упомянутых методов: https://ruby -doc.org / core-2.6.5 / Object.html # method-i-send

Вызывает метод, определенныйсимвол, передавая ему любые аргументы, указанные. Вы можете использовать __send__, если имя отправляет конфликт с существующим методом в obj. Когда метод идентифицируется строкой, строка преобразуется в символ.

Обязательно попробуйте ограничить сферу его использования, так как это мощный метод, он может легко ломать вещи.

...