È possibile specificare le opzioni di formattazione per to_yaml in ruby?

StackOverflow https://stackoverflow.com/questions/1054730

  •  20-08-2019
  •  | 
  •  

Domanda

Il codice

require 'yaml'
puts YAML.load("
is_something:
  values: ['yes', 'no']
").to_yaml

produce

--- 
is_something: 
  values: 
  - "yes"
  - "no"

Mentre questo è corretto, yaml, sembra proprio brutto quando si dispone di un hash di matrici.C'è un modo per me per ottenere to_yaml per produrre l'inline array versione di yaml?

Opzioni di hash può essere passato a to_yaml ma come si utilizza?

Edit 0:Grazie Pozsár Balázs.Ma, come di ruby 1.8.7 (2009-04-08 patchlevel 160), le opzioni di hash non funziona come pubblicizzato.:(

irb
irb(main):001:0> require 'yaml'
=> true
irb(main):002:0> puts [[ 'Crispin', 'Glover' ]].to_yaml( :Indent => 4, :UseHeader => true, :UseVersion => true )
--- 
- - Crispin
  - Glover
=> nil
È stato utile?

Soluzione 2

Questo brutto hack sembra fare il trucco...

class Array
  def to_yaml_style
    :inline
  end
end

La navigazione attraverso ruby source, non riesco a trovare le opzioni che ho potuto passare per raggiungere lo stesso.Di Default le opzioni sono descritte nella lib/yaml/costanti.rb.

Altri suggerimenti

Circa l'hash opzioni:vedere http://yaml4r.sourceforge.net/doc/page/examples.htm

Ex.24:Utilizzando to_yaml con opzioni Hash

puts [[ 'Crispin', 'Glover' ]].to_yaml( :Indent => 4, :UseHeader => true, :UseVersion => true )
# prints:
#   --- %YAML:1.0
#   -
#       - Crispin
#       - Glover

Ex.25:Simboli disponibili per le opzioni di Hash

Indent:L'impostazione predefinita di rientro da utilizzare quando emissione (per impostazione predefinita 2)
Separator:Il separatore di default da utilizzare tra i documenti (per impostazione predefinita '---')
SortKeys:Sorta chiavi Hash quando si emette?(per impostazione predefinita false)
UseHeader:Display YAML intestazione quando si emette?(per impostazione predefinita false)
UseVersion:Display YAML versione al momento dell'emissione?(per impostazione predefinita false)
AnchorFormat:Una stringa di formattazione per ancoraggio Id quando emettono (il valore predefinito è 'id%03d')
ExplicitTypes:L'uso esplicito di tipi di emissione?(per impostazione predefinita false)
BestWidth:La larghezza del carattere da utilizzare in fase di ripiegamento di testo (per impostazione predefinita 80)
UseFold:Forza di piegatura di testo quando si emette?(per impostazione predefinita false)
UseBlock:Forza di tutto il testo letterale quando si emette?(per impostazione predefinita false)
Encoding:Formato Unicode codifica con (per impostazione predefinita :Utf8;richiede Iconv)

A partire da Ruby 1.9 psych viene utilizzato come default YAML motore.Supporta alcuni attributi: http://ruby-doc.org/stdlib-2.1.0/libdoc/psych/rdoc/Psych/Handler/DumperOptions.html

Quindi per me funziona:

irb(main):001:0> require 'yaml'
=> true
irb(main):002:0> puts [{'a'=> 'b', 'c'=> 'd'}, {'e'=> 'f', 'g'=>'h'}].to_yaml(:indentation => 4)
---
-   a: b
    c: d
-   e: f
    g: h

Solo un altro trucco per specificare lo stile di uscita, ma questo permette di personalizzare ogni oggetto specifico, invece di tutto il mondo (ad es.per tutte le matrici).

https://gist.github.com/jirutka/31b1a61162e41d5064fc

Semplice esempio:

class Movie
  attr_accessor :genres, :actors

  # method called by psych to render YAML
  def encode_with(coder)
    # render array inline (flow style)
    coder['genres'] = StyledYAML.inline(genres) if genres
    # render in default style (block)
    coder['actors'] = actors if actors
  end
end

Le ultime versioni di Ruby utilizzare il Psych modulo per analisi YAML.Non ci sono molte opzioni che si possono passare, ma è possibile modificare l'indentazione e la larghezza della linea.Controllare le ultime Psych documentazione per ulteriori dettagli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top