'a'
- это просто режим открытия файла, как вы могли видеть в C / C ++.Это означает добавление и является относительно редким - вы, скорее всего, знакомы с 'r'
(чтение), 'w'
(запись) и т. Д.
Бит {|f| ... }
- это захватывающая часть.Он называется блоком - они повсюду, и, вероятно, они моя любимая часть Ruby - я недавно вернулся на C ++ и проклинаю язык за то, что он не поддерживает их все время .
Думайте о коде, подобном foo(bar) {|baz| ... }
, как о создании безымянной функции и передаче этой функции в качестве другого (скрытого) аргумента в foo
(вроде как this
- это скрытый аргумент для функций-членов в C ++)- это просто не так скрыто, потому что вы указываете это прямо здесь.
Теперь, когда вы передадите блок в foo
, он в конечном итоге вызовет ваш блок (используя оператор yield
), и этопредоставит аргумент baz
.Если бы мой foo
вел себя как ваша File.open
функция, его определение выглядело бы примерно так:
def foo(filename, &block)
file = File.open(filename)
yield(file)
file.close
end
Вы можете увидеть, как он открывает файл, передает его в ваш блок с помощью yield
, изатем закрывает файл, как только ваш блок возвращается.Очень удобно - блоки - ваши друзья!
Еще одно хорошее место, где можно начать оборачивать их, - это функция each
- одна из самых простых и распространенных функций блоков в Ruby:
[holt@Michaela ~]$ irb
irb(main):001:0> ['Welcome', 'to', 'Ruby!'].each {|word| puts word}
Welcome
to
Ruby!
=> ["Welcome", "to", "Ruby!"]
irb(main):002:0>
На этот раз ваш блок вызывается три раза, и каждый раз, когда в ваш блок yield
вводится другой элемент массива как word
- это очень простой способ вызова функции для каждого элемента массива.
Надеюсь, это поможет, и добро пожаловать в Ruby!