Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将YAML中的别名与Ruby一起使用_Ruby_Yaml - Fatal编程技术网

将YAML中的别名与Ruby一起使用

将YAML中的别名与Ruby一起使用,ruby,yaml,Ruby,Yaml,我有以下YAML: - PRO_PLAN: - description: This is the Pro plan publicName: Pro Plan startDate: 12-20-2015 - PRO_MONTHLY_DIRECT: - publicName: Pro Monthly price: 20 sub_target: zone - PRICING_COMPONENTS: &pro_entitlem

我有以下YAML:

- PRO_PLAN:
  - description: This is the Pro plan
    publicName: Pro Plan
    startDate: 12-20-2015

  - PRO_MONTHLY_DIRECT:
    - publicName: Pro Monthly 
      price: 20
      sub_target: zone

    - PRICING_COMPONENTS: &pro_entitlements
      analytics_range: 21600
      rules: 10
      cannon: true


  - PRO_ANNUAL_DIRECT:
    - publicName: Pro Annual  
      price: 240
      sub_target: zone

    - PRICING_COMPONENTS:
      <<: *pro_entitlements

我不是YAML高手,但看起来你使用了错误的语法。试试这个:

-
  PRO_PLAN:
    -
      description: "This is the Pro plan"
      publicName: "Pro Plan"
      startDate: 12-20-2015
    -
      PRO_MONTHLY_DIRECT:
        -
          price: 20
          publicName: "Pro Monthly"
          sub_target: zone
        -
          PRICING_COMPONENTS: &pro_entitlements
            -
              analytics_range: 21600
              cannon: true
              rules: 10
              works: true
    -
      PRO_ANNUAL_DIRECT:
        -
          price: 240
          publicName: "Pro Annual"
          sub_target: zone
        -
          PRICING_COMPONENTS:
            -
              <<: *pro_entitlements
-
专业计划:
-
描述:“这是专业计划”
公共名称:“专业计划”
起始日期:12-20-2015
-
PRO_月刊(PRO_DIRECT):
-
价格:20
publicName:“专业月刊”
次级目标:区域
-
定价\u组件:&专业\u权利
-
分析范围:21600
坎农:是的
规则:10
作品:真的
-
专业人员年度指导:
-
售价:240
公共名称:“专业年度”
次级目标:区域
-
定价单元组件:
-

似乎正确的语法是为
定价组件的sub
Hash
添加缩进:

---
- PRO_PLAN:
  - description: This is the Pro plan
    publicName: Pro Plan
    startDate: 12-20-2015

  - PRO_MONTHLY_DIRECT:
    - publicName: Pro Monthly 
      price: 20
      sub_target: zone

    - PRICING_COMPONENTS: &pro_entitlements
        analytics_range: 21600
        rules: 10
        cannon: true

  - PRO_ANNUAL_DIRECT:
    - publicName: Pro Annual  
      price: 240
      sub_target: zone

    - PRICING_COMPONENTS:
        <<: *pro_entitlements
---
-专业计划:
-说明:这是Pro计划
公众名称:专业计划
起始日期:12-20-2015
-PRO_月刊(PRO_DIRECT):
-公众名称:专业月刊
价格:20
次级目标:区域
-定价\u组件:&专业\u权利
分析范围:21600
规则:10
坎农:是的
-专业人员年度指导:
-公众名称:专业年刊
售价:240
次级目标:区域
-定价单元组件:

当我需要构建更复杂的YAML文档时,我通常从使用Ruby和Ruby的哈希和数组对象开始。YAML序列化程序知道如何构建别名和锚定,如果我们允许,它将这样做:

require 'yaml'

foo = {'foo' => 1}
bar = {'bar' => 2, 'foo' => foo}
baz = {'baz' => 3, 'foo' => foo}

puts [foo, bar, baz].to_yaml

# >> ---
# >> - &1
# >>   foo: 1
# >> - bar: 2
# >>   foo: *1
# >> - baz: 3
# >>   foo: *1
这里它为
foo
数组创建一个别名,然后在序列化哈希数组时引用它

对YAML使用相同的想法:

require 'yaml'

PRO_ENTITLEMENTS = {
  'analytics_range' => 21600,
  'rules'           => 10,
  'cannon'          => true
}

doc = [
  {
    'PRO_PLAN' => 
    [
      {
        'description' => 'This is the Pro plan',
        'publicName'  => 'Pro Plan',
        'startDate'   => '12-20-2015'
      },
      {
        'PRO_MONTHLY_DIRECT' => 
        [
          {
            'publicName' => 'Pro Monthly',
            'price'      => 20,
            'sub_target' => 'zone'
          },
          {
            'PRICING_COMPONENTS' => PRO_ENTITLEMENTS,
            'analytics_range'    => 21600,
            'rules'              => 10,
            'cannon'             => true
          }
        ]
      },
      {
        'PRO_ANNUAL_DIRECT' => 
        [
          {
            'publicName' => 'Pro Annual',
            'price'      => 240,
            'sub_target' => 'zone'
          },
          {
            'PRICING_COMPONENTS' => PRO_ENTITLEMENTS,
          }
        ]
      }
    ]
  }
]

puts doc.to_yaml
运行它会返回:

---
- PRO_PLAN:
  - description: This is the Pro plan
    publicName: Pro Plan
    startDate: 12-20-2015
  - PRO_MONTHLY_DIRECT:
    - publicName: Pro Monthly
      price: 20
      sub_target: zone
    - PRICING_COMPONENTS: &1
        analytics_range: 21600
        rules: 10
        cannon: true
      analytics_range: 21600
      rules: 10
      cannon: true
  - PRO_ANNUAL_DIRECT:
    - publicName: Pro Annual
      price: 240
      sub_target: zone
    - PRICING_COMPONENTS: *1
这并不能保证是适合您使用的正确输出,只是一个如何在Ruby中构建结构并让YAML输出它的示例,这样您就可以看到序列化后它应该是什么样子

我们可以运行往返测试:

YAML.load(doc.to_yaml)
# => [{"PRO_PLAN"=>
#       [{"description"=>"This is the Pro plan",
#         "publicName"=>"Pro Plan",
#         "startDate"=>"12-20-2015"},
#        {"PRO_MONTHLY_DIRECT"=>
#          [{"publicName"=>"Pro Monthly", "price"=>20, "sub_target"=>"zone"},
#           {"PRICING_COMPONENTS"=>
#             {"analytics_range"=>21600, "rules"=>10, "cannon"=>true},
#            "analytics_range"=>21600,
#            "rules"=>10,
#            "cannon"=>true}]},
#        {"PRO_ANNUAL_DIRECT"=>
#          [{"publicName"=>"Pro Annual", "price"=>240, "sub_target"=>"zone"},
#           {"PRICING_COMPONENTS"=>
#             {"analytics_range"=>21600, "rules"=>10, "cannon"=>true}}]}]}]

我认为Ruby YAML语法分析器失败来检测错误。如果您试图在我的

ruamel.yaml
解析器上来回执行此操作(基于Python,这将保留别名/锚点名称和
我很高兴它起到了作用。利用Ruby输出YAML的能力没有什么错。我最喜欢的物理老师告诉我,聪明人很懒惰,会找到简单的方法做事。如果它适合你的大脑,就使用它。谢谢你,它太棒了。让我更聪明yaml解决了它自己奇怪的语法…谢谢你!我更喜欢认为它是恶魔。很高兴它有帮助。
YAML.load(doc.to_yaml)
# => [{"PRO_PLAN"=>
#       [{"description"=>"This is the Pro plan",
#         "publicName"=>"Pro Plan",
#         "startDate"=>"12-20-2015"},
#        {"PRO_MONTHLY_DIRECT"=>
#          [{"publicName"=>"Pro Monthly", "price"=>20, "sub_target"=>"zone"},
#           {"PRICING_COMPONENTS"=>
#             {"analytics_range"=>21600, "rules"=>10, "cannon"=>true},
#            "analytics_range"=>21600,
#            "rules"=>10,
#            "cannon"=>true}]},
#        {"PRO_ANNUAL_DIRECT"=>
#          [{"publicName"=>"Pro Annual", "price"=>240, "sub_target"=>"zone"},
#           {"PRICING_COMPONENTS"=>
#             {"analytics_range"=>21600, "rules"=>10, "cannon"=>true}}]}]}]
expected a mapping or list of mappings for merging, but found scalar   
   in "<byte string>", line 11, column 27:  
        - PRICING_COMPONENTS: &pro_entitlements
                              ^
- PRICING_COMPONENTS: &pro_entitlements
  analytics_range: 21600
  rules: 10
  cannon: true