2009-06-28 12 views
18

El código¿Es posible especificar opciones de formato para to_yaml en ruby?

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

produce

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

bien este es un yaml correcta, que sólo se ve feo cuando se tiene un hash de matrices. ¿Hay alguna manera de obtener to_yaml para producir la versión en línea del yall?

Un hash de opciones se puede pasar al to_yaml, pero ¿cómo lo usas?

Editar 0: Gracias Pozsár Balázs. Pero, a partir de ruby ​​1.8.7 (2009-04-08 patchlevel 160), el hash de opciones no funciona como se anuncia. :(

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 

Respuesta

6

Este truco feo parece hacer el truco ...

class Array 
    def to_yaml_style 
    :inline 
    end 
end 

Navegación a través de la fuente de rubí , No puedo encontrar ninguna opción que pueda pasar para lograr lo mismo. Las opciones predeterminadas se describen en el lib/yaml/constants.rb.

+3

Para imprimir solo arreglos pequeños en línea: clase Array; def to_yaml_style(); self.length <5? : en línea: super; extremo final – Costi

9

Acerca de las opciones de hash: ver http://yaml4r.sourceforge.net/doc/page/examples.htm

Ex. 24: Uso de to_yaml con una opciones Hash

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

Ex. 25: Símbolos disponibles para una opciones Hash

Indent: La sangría predeterminada para usar al emitir (por defecto es 2)
Separator: El separador predeterminado para utilizar documentos (por defecto) '---'
SortKeys: claves de ordenación Hash al emitir? (predeterminado a false)
UseHeader: ¿muestra el encabezado YAML al emitir? (predeterminado a false)
UseVersion: ¿Visualiza la versión de YAML cuando se emite? (por defecto) false
AnchorFormat: Una cadena de formato para los ID de anclaje cuando emisores de luz (por defecto es 'id%03d')
ExplicitTypes: Utilice los tipos explícitos cuando se emiten? (por defecto) false
BestWidth: El ancho de los caracteres a utilizar cuando se pliega de texto (por defecto) 80
UseFold: Fuerza de plegado de texto cuando se emiten? (Por defecto es false)
UseBlock: ¿Forzar todo el texto a ser literal cuando se emite? (por defecto) false
Encoding: formato Unicode para codificar con (por defecto :Utf8; requiere Iconv)

+15

no funciona. Desde la fuente, ni siquiera estoy seguro de si el hash de opts se está pasando a syck. – anshul

1

Simplemente otro truco para especificar el estilo de salida, pero este permite personalizarlo por objeto específico, en lugar de hacerlo de manera global (por ejemplo, para todas las matrices).

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

ejemplo simple:

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 
Cuestiones relacionadas