Один объект YAML может относиться к другому?

Я хотел бы иметь один объект yaml, относятся к другому, как так:

intro: "Hello, dear user."

registration: $intro Thanks for registering!

new_message: $intro You have a new message!

Вышеупомянутый синтаксис является просто примером того, как он мог бы работать (это также, как это, кажется, работает в этом cpan модуле.)

Я использую стандартный рубин yaml синтаксический анализатор.

Действительно ли это возможно?

5
задан John Bachir 3 May 2018 в 21:16
поделиться

2 ответа

Некоторые объекты yaml действительно ссылаются на другие:

irb> require 'yaml'
#=> true
irb> str = "hello"
#=> "hello"
irb> hash = { :a => str, :b => str }
#=> {:a=>"hello", :b=>"hello"}
irb> puts YAML.dump(hash)
---
:a: hello
:b: hello
#=> nil
irb> puts YAML.dump([str,str])
---
- hello
- hello
#=> nil
irb> puts YAML.dump([hash,hash])
---
- &id001
  :a: hello
  :b: hello
- *id001
#=> nil

Обратите внимание, что он не всегда повторно использует объекты (строка просто повторяется), но иногда (хэш определяется один раз и повторно используется по ссылке).

YAML не поддерживает интерполяцию строк - это то, что вы, кажется, пытаетесь сделать - но нет причин, по которым вы не могли бы кодировать ее более подробно:

intro: Hello, dear user
registration: 
- "%s Thanks for registering!"
- intro
new_message: 
- "%s You have a new message!"
- intro

Затем вы можете интерполировать ее после загрузки YAML :

strings = YAML::load(yaml_str)
interpolated = {}
strings.each do |key,val|
  if val.kind_of? Array
    fmt, *args = *val
    val = fmt % args.map { |arg| strings[arg] }
  end
  interpolated[key] = val
end

И это даст следующее для интерполированного :

{
  "intro"=>"Hello, dear user", 
  "registration"=>"Hello, dear user Thanks for registering!", 
  "new_message"=>"Hello, dear user You have a new message!"
}
7
ответ дан 14 December 2019 в 01:01
поделиться

Вместо того, чтобы пытаться использовать неявные ссылки в вашем yaml, почему бы вам не использовать строки подстановки (как показано выше, вам нужны кавычки) и явно подставить их содержимое во время синтаксического анализа ?

2
ответ дан 14 December 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: