如何将 YAML 文件读入哈希
How to read a YAML file into a Hash
我需要将 YAML 配置文件作为 Crystal 中的哈希从磁盘读取到内存中。 (我知道 this 邮件列表中关于该主题的讨论,尽管我觉得它有点混乱。)
我尝试读取的 YAML 文件是一个相当简单的配置文件:
---
:excludes:
- Stage
- Class
- Anchor
- Notify
- Node
- /::/
:only_include: []
:md5sums: false
:class_name: null
:catalog_file: null
:output_file: spec/classes/init_spec.rb
:compile_test: true
:setup: {}
显示如何使用 Crystal 0.25 将 YAML 配置文件从磁盘读取到哈希中的代码示例将非常有帮助。
我不确定这个简单的示例是否对您有所帮助,但也许它会提供一些提示:
yaml = File.open("conf.yml") { |file| YAML.parse(file) }
yaml.class # => YAML::Any
hash = yaml.as_h # As you can see below, it gives a Hash, but with YAML::Any underneath
hash.class # => Hash(YAML::Any, YAML::Any)
yaml[":excludes"].as_a.first # => "Stage"
yaml[":md5sums"] == false # => true
yaml[":output_file"].as_s + "-FOO" # => "spec/classes/init_spec.rb-FOO"
yaml[":setup"].as_h.class # => Hash(YAML::Any, YAML::Any)
因此,您需要记住 YAML 是数据的来源,并且不要忘记使用 .as_*
方法将其转换为所需的类型。
这是最好的方法。
require "yaml"
class Config
include YAML::Serializable
@[YAML::Field(key: ":excludes")]
property excludes : Array(String)
@[YAML::Field(key: ":only_include")]
property only_include : Array(String)
@[YAML::Field(key: ":md5sums")]
property md5sums : Bool
@[YAML::Field(key: ":class_name")]
property class_name : String?
@[YAML::Field(key: ":catalog_file")]
property catalog_file : String?
@[YAML::Field(key: ":output_file")]
property output_file : String
@[YAML::Field(key: ":compile_test")]
property compile_test : Bool
@[YAML::Field(key: ":setup")]
property setup : Hash(String, String)
end
yaml = <<-YAML
:excludes:
- Stage
- Class
- Anchor
- Notify
- Node
- /::/
:only_include: []
:md5sums: false
:class_name: null
:catalog_file: null
:output_file: spec/classes/init_spec.rb
:compile_test: true
:setup: {}
YAML
p Config.from_yaml(yaml)
请注意,Crystal 中的 YAML 目前不支持从 YAML 创建正则表达式,因此您可能希望在解析它之后执行此操作(使用转换器有点棘手)。
我需要将 YAML 配置文件作为 Crystal 中的哈希从磁盘读取到内存中。 (我知道 this 邮件列表中关于该主题的讨论,尽管我觉得它有点混乱。)
我尝试读取的 YAML 文件是一个相当简单的配置文件:
---
:excludes:
- Stage
- Class
- Anchor
- Notify
- Node
- /::/
:only_include: []
:md5sums: false
:class_name: null
:catalog_file: null
:output_file: spec/classes/init_spec.rb
:compile_test: true
:setup: {}
显示如何使用 Crystal 0.25 将 YAML 配置文件从磁盘读取到哈希中的代码示例将非常有帮助。
我不确定这个简单的示例是否对您有所帮助,但也许它会提供一些提示:
yaml = File.open("conf.yml") { |file| YAML.parse(file) }
yaml.class # => YAML::Any
hash = yaml.as_h # As you can see below, it gives a Hash, but with YAML::Any underneath
hash.class # => Hash(YAML::Any, YAML::Any)
yaml[":excludes"].as_a.first # => "Stage"
yaml[":md5sums"] == false # => true
yaml[":output_file"].as_s + "-FOO" # => "spec/classes/init_spec.rb-FOO"
yaml[":setup"].as_h.class # => Hash(YAML::Any, YAML::Any)
因此,您需要记住 YAML 是数据的来源,并且不要忘记使用 .as_*
方法将其转换为所需的类型。
这是最好的方法。
require "yaml"
class Config
include YAML::Serializable
@[YAML::Field(key: ":excludes")]
property excludes : Array(String)
@[YAML::Field(key: ":only_include")]
property only_include : Array(String)
@[YAML::Field(key: ":md5sums")]
property md5sums : Bool
@[YAML::Field(key: ":class_name")]
property class_name : String?
@[YAML::Field(key: ":catalog_file")]
property catalog_file : String?
@[YAML::Field(key: ":output_file")]
property output_file : String
@[YAML::Field(key: ":compile_test")]
property compile_test : Bool
@[YAML::Field(key: ":setup")]
property setup : Hash(String, String)
end
yaml = <<-YAML
:excludes:
- Stage
- Class
- Anchor
- Notify
- Node
- /::/
:only_include: []
:md5sums: false
:class_name: null
:catalog_file: null
:output_file: spec/classes/init_spec.rb
:compile_test: true
:setup: {}
YAML
p Config.from_yaml(yaml)
请注意,Crystal 中的 YAML 目前不支持从 YAML 创建正则表达式,因此您可能希望在解析它之后执行此操作(使用转换器有点棘手)。