Ruby 中的 YAML。 load 和 load_file 有什么区别?

YAML in Ruby. What is the difference between load and load_file?

我有这个 practice.yml 文件:

foo: whatever 
bar: 
 - 
   fruit: apple 
   name: steve 
   sport: baseball 
 - more 
 - 
   python: rocks 
   perl: papers 
   ruby: scissorses 

#load 和#load_file 之间有什么区别?

#load 似乎施展了魔法并接受了一个字符串:

pry(main)> YAML.load("'a'")
"a"
[11] pry(main)> YAML.load("a:1")
"a:1"
[12] pry(main)> YAML.load("-a")
"-a"
[13] pry(main)> YAML.load("[a]")
[
    [0] "a"
]
[14] pry(main)> YAML.load("[a,bc]")
[
    [0] "a",
    [1] "bc"
]

而 load_file 似乎只获取了一个包含有效 yaml 的文件:

irb(main):002:0> YAML.load_file("practice.yml")
=> {"foo"=>"whatever", "bar"=>[{"fruit"=>"apple", "name"=>"steve", "sport"=>"baseball"}, "more", {"python"=>"rocks", "perl"=>"papers", "ruby"=>"scissorses"}]}

load_file 调用加载,如下所示:

    def self.load_file(filename, options={})
      if SafeYAML::MULTI_ARGUMENT_YAML_LOAD
        File.open(filename, 'r:bom|utf-8') { |f| self.load(f, filename, options) }

      else
        # Ruby pukes on 1.9.2 if we try to open an empty file w/ 'r:bom|utf-8';
        # so we'll not specify those flags here. This mirrors the behavior for
        # unsafe_load_file so it's probably preferable anyway.
        self.load File.open(filename), nil, options
      end
    end

现在 load() 的原型是

def self.load(yaml, filename=nil, options={})

所以基本上 load_file 在检查与 Ruby 1.9.2

相关的一些空文件情况后,打开文件名并将结果字符串传递给 load()