Что это за синтаксис Ruby?
Я просто прочитал следующий код:
class Dir
def self.create_uniq &b ### Here, & should mean b is a block
u = 0
loop do
begin
fn = b[u] ### But, what does b[u] mean? And b is not called.
FileUtils.mkdir fn
return fn
rescue Errno::EEXIST
u += 1
end
end
io
end
end
Я помещаю свое замешательство в комментарий в коде.
Ответы
Ответ 1
Метод определения с &b
в конце позволяет использовать блок, переданный методу как объект Proc
.
Теперь, если у вас есть экземпляр Proc
, синтаксис []
сокращен до call
:
p = Proc.new { |u| puts u }
p['some string']
# some string
# => nil
Документировано здесь → Proc#[]
Ответ 2
Оператор and prefix позволяет методу захватить переданный блок как именованный параметр. например:
def wrap &b
3.times(&b)
print "\n"
end
теперь, если вы вызываете метод выше:
wrap { print "Hi " }
тогда вывод будет:
Hi Hi Hi