2013-11-08 4 views
0

Это, как я читаю мой файл:Как использовать амперсанд префикс с другими аргументами

raw = File.open(fname) { |f| f.read } 

Я думал, что воспользоваться ярлыками в Ruby, такие как & оператора, чтобы преобразовать свой аргумент в прок. Например, можно было бы использовать

nums = gets.split.map &:to_i # get numbers from stdin 

Вместо

nums = gets.split.map { |x| x.to_i } 

Итак, я попробовал:

raw = File.open(fname) &:read 

И я получил ошибку:

path/to/file.rb:3:in `<main>': undefined method `&' for #<File:testing.txt> (NoMethodError) 

Это Безразлично» t работает с круглыми скобками (raw = File.open(fname)(&:read)) ,

Как я могу использовать этот ярлык для открытия файла? Если я не могу, то почему бы и нет?

+2

Да, я не знал об этом. Круто. Кроме того, <вставьте здесь медицинскую шутку>. – iamnotmaynard

+0

Просто небольшое разъяснение: я считаю, '' '' to_proc'; '&' - proc-to_block. –

+0

@ Cary Swoveland ':' является частью символьного литерала. '' '' 'to_proc' для блокировки. – sawa

ответ

2

Попробуйте

raw = File.open(fname).read 

Edit: Проблема в том, что она не закрывает файл, как указано ОП.

Однако это делает работу с рубином 1.9.3p448:

raw = File.open(fname, &:read) 

Это просто демонстрирует использование представления &/символ блока в рубин. Как указывает пила, на практике обычно делаются:

raw = File.read(fname) 
+1

Это не закрывает файл. – Doorknob

+0

@Doorknob: Вы правы. Однако 'raw = File.open (fname, &: read)' работает; не знаю, почему он не работал на вас. Какая версия рубина у вас есть? – Matt

+0

Ах, похоже, это работает. По какой-то причине это не было, когда я его протестировал. Может быть, опечатка? В любом случае, спасибо! – Doorknob

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