Что это за синтаксис 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