2016-03-16 5 views
1

У меня есть этот файл practice.yml:YAML в Ruby. В чем разница между load и load_file?

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"}]} 

ответ

1

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 

Теперь прототип для загрузки() является

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

поэтому в основном load_file открывает имя файла и передавая полученную строку для загрузки(), после проверки какой-нибудь пустой случае файла, связанного с Руби 1.9.2

+0

Как вы узнали, что код load_file? – Jwan622

+0

В этом случае, какая магия происходит в #load, поскольку она, похоже, обрабатывает строки и выводит хэши или массивы в зависимости от разметки строк. – Jwan622

+0

Пример: (извините за форматирование) $ bundle show yaml ~/.rbenv/versions/2.2 .0/lib/ruby ​​/ gems/2.2.0/gems/safe_yaml-1.0.4 $ mate '!!' mate 'bundle show yaml' – Rob

Смежные вопросы