هل من الممكن تحديد خيارات التنسيق لـ to_yaml في روبي؟

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:شكرا بوزار بالاز.ولكن، اعتبارًا من روبي 1.8.7 (2009-04-08 مستوى التصحيح 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

والتصفح من خلال مصدر روبي، وأنا لا يمكن العثور على أي خيارات I يمكن أن تمر على تحقيق ذاته. ووصف الخيارات الافتراضية في ليب / YAML / constants.rb .

نصائح أخرى

وعن خيارات التجزئة: انظر http://yaml4r.sourceforge.net/doc/ صفحة / 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: تنسيق يونيكود لتشفير مع (الافتراضي :Utf8، يتطلب يكونف)

ويستخدم ابتداء من روبي 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