Что означает 'a' в Ruby `open ()`, и что означает | f | имею в виду? - PullRequest
3 голосов
/ 02 апреля 2011

Что означают 'a' и |f| ниже?

open('myfile.out', 'a') { |f|
  f.puts "Hello, world."
}

Ответы [ 7 ]

7 голосов
/ 02 апреля 2011

Из рубина IO doc :

 "a"  |  Write-only, starts at end of file if file exists,
      |  otherwise creates a new file for writing.

|f| - это переменная, которая содержит объект ввода-вывода в блоке (все в {}). Поэтому, когда вы f.puts "Hello World" вызываете puts для объекта ввода-вывода, который затем записывает в файл.

5 голосов
/ 02 апреля 2011

'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!

4 голосов
/ 02 апреля 2011

'a' -> Режим, в котором открывается файл (режим 'добавления') f - это параметр блока.Блок - это фрагмент кода, который может быть выполнен (это объект Proc внизу).

Здесь f, я думаю, будет дескриптором файла.

3 голосов
/ 02 апреля 2011

1) Вы вызываете метод open, передавая два аргумента:

  1. myfile.out <- это ваш файл, к которому вы хотите получить доступ </li>
  2. a <-- вы заявляете, что хотите записать в файл, начиная с конца файла (он же добавление) </li>

2) Метод open, существующий в Kernel , возвращает объект потока ввода-вывода aka |f|, к которому вы можете обращаться по всему блоку.

3) Вы добавляете «hello world» в myfile.out

4) После завершения блока поток ввода-вывода закрывается.

2 голосов
/ 02 апреля 2011

Я бы настоятельно рекомендовал прочитать файл справки для Класса файлов для начинающих.
Вы можете найти там документацию по методу open .
Методсигнатура File.open(filename, mode)
Итак, в вашем примере a - это режим, который в данном случае равен append .Вот список допустимых значений для аргумента mode:
'r' - Открыть файл для чтения.Файл должен существовать.
'w' - Создать пустой файл для записи.Если файл с таким именем уже существует, его содержимое стирается, и файл обрабатывается как новый пустой файл.
'a' - Добавить к файлу.Операции записи добавляют данные в конец файла.Файл создается, если он не существует.
'r+' - Открыть файл для обновления и чтения, и записи.Файл должен существовать.
'w+' - Создать пустой файл для чтения и записи.Если файл с таким именем уже существует, его содержимое стирается, и файл обрабатывается как новый пустой файл.
'a+' - Открыть файл для чтения и добавления.Все операции записи выполняются в конце файла, защищая предыдущий контент для перезаписи.Вы можете переместить (fseek, rewind) внутренний указатель в любое место файла для чтения, но операции записи переместят его обратно в конец файла.Файл создается, если он не существует.

Если в блоке используется File.open, как, например, в вашем примере, тогда f становится переменной блока, которая указывает на вновь открытый файл, что позволяет вам как читать, так и записывать в файлпросто используя f в качестве ссылки, находясь в пределах блока.Использование этой формы File.open хорошо, потому что она обрабатывает закрытие файла автоматически, когда заканчивается блок.

2 голосов
/ 02 апреля 2011

'a', обозначающее добавление, открывает файл в режиме только для записи и начинает запись в конце файла.Если файл не существует, создается новый файл.Пожалуйста, смотрите Ruby Docs для получения дополнительной информации.

The | f |является параметром блока, который передается в {}.Для получения дополнительной информации о блоках см. Руководство программиста Pragmatic .

1 голос
/ 02 апреля 2011

open ('myfile.out', 'a') -> Здесь 'a' означает доступ только для записи.Указатель располагается в конце файла.

| f |это дескриптор файла, он добавляет «Hello, World».

Вместо | f | вы можете написать что угодно, скажем | abc |или | line |, это не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...