Проблема в том, что вы объявили, что метод "print_string
" принимает аргумент блока (озадаченно названный "str
"), и вы просто печатаете сам процесс. Возможно, вы захотите вызвать данную процедуру, чтобы увидеть возвращаемое ей строковое значение:
def call_proc(&proc)
proc.call
end
call_proc { 'Foobar' }
# => "Foobar"
То, что вы обнаружили, - это синтаксический сахар, который, если вы украсите последний аргумент определения метода амперсандом &
, то он будет связан с аргументом блока с вызовом метода. Альтернативный способ выполнения той же задачи заключается в следующем:
def call_proc2
yield if block_given?
end
call_proc2 { 'Example' }
# => 'Example'
Обратите внимание, что процедуры можно обрабатывать напрямую как объекты, используя Proc
objects (или псевдоним "lambda" для конструктора Proc):
p1 = Proc.new { 'Foo' }
p1.call # => "Foo"
p2 = lambda { 'Bar' }
p2.call # => "Bar"