Можно ли указать параметры форматирования для to_yaml в ruby?

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

  •  20-08-2019
  •  | 
  •  

Вопрос

Код

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

производит

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

Хотя это правильный yaml, он просто выглядит уродливо, когда у вас есть хэш массивов.Есть ли способ для меня получить to_yaml чтобы создать версию встроенного массива yaml?

Хэш параметров может быть передан to_yaml но как вы это используете?

Редактировать 0:Thanks Pozsár Balázs.Но, начиная с ruby 1.8.7 (2009-04-08 patchlevel 160), хэш опций работает не так, как рекламируется.:(

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
Это было полезно?

Решение 2

Этот уродливый взлом, кажется, делает свое дело...

class Array
  def to_yaml_style
    :inline
  end
end

Просматривая исходный код ruby, я не могу найти никаких вариантов, которые я мог бы использовать для достижения того же.Параметры по умолчанию описаны в библиотека/yaml/constants.rb.

Другие советы

О параметрах хэша:видишь http://yaml4r.sourceforge.net/doc/page/examples.htm

Бывший.24:Используя to_yaml с хэшем опций

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

Бывший.25:Доступные символы для хэша опций

Indent:Отступ по умолчанию, используемый при выделении (по умолчанию 2)
Separator:Разделитель по умолчанию для использования между документами (по умолчанию используется '---')
SortKeys:Сортировать хэш-ключи при отправке?(по умолчанию используется значение false)
UseHeader:Отображать заголовок YAML при отправке?(по умолчанию используется значение false)
UseVersion:Отображать версию YAML при отправке?(по умолчанию используется значение false)
AnchorFormat:Строка форматирования для идентификаторов привязки при отправке (по умолчанию 'id%03d')
ExplicitTypes:Использовать явные типы при испускании?(по умолчанию используется значение false)
BestWidth:Ширина символа, используемая при сворачивании текста (по умолчанию 80)
UseFold:Принудительно сворачивать текст при отправке?(по умолчанию используется значение false)
UseBlock:Заставить весь текст быть буквальным при отправке?(по умолчанию используется значение false)
Encoding:Формат Unicode для кодирования (по умолчанию используется :Utf8;требуется Iconv)

Начиная с Ruby 1.9 psych используется в качестве движка YAML по умолчанию.Он поддерживает некоторые атрибуты: http://ruby-doc.org/stdlib-2.1.0/libdoc/psych/rdoc/Psych/Handler/DumperOptions.html

Так что для меня это работает:

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

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

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

Простой пример:

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

Последние версии Ruby используют модуль Psych для синтаксического анализа YAML.Существует не так много параметров, которые вы можете передать, но вы можете изменить отступ и ширину строки.Проверьте последние Психологическая документация для получения более подробной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top