Ruby - что это за выход - PullRequest
       10

Ruby - что это за выход

1 голос
/ 12 августа 2011

Я знаю, что этот код может быть не совсем корректным:

def print_string(&str)
puts str
end

print_string{"Abder-Rahman"}

Но когда я запускаю его, вот что я получаю:

#<Proc:0x03e25d98@r.rb:5>

Что это за выход?

Ответы [ 4 ]

5 голосов
/ 12 августа 2011

Это строковое представление по умолчанию для объекта Proc. Поскольку «Абдер-Рахман» в скобках, Руби считает, что вы определяете блок. Вы хотели поместить str.call в определение вашей функции? Это должно вызвать ваш блок и вернуть строковое выражение, которое вы определили внутри него.

4 голосов
/ 12 августа 2011

Проблема в том, что вы объявили, что метод "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"
2 голосов
/ 12 августа 2011

Вы передаете блок методу, обозначенному префиксом & и тем, как вы его вызываете. Затем этот блок внутренне преобразуется в Proc.

puts str.call внутри вашего метода напечатает строку, хотя почему вы хотите определить метод таким образом, это другой вопрос

См. Proc: http://www.ruby -doc.org / ядро ​​/ классов / Proc.html

0 голосов
/ 12 августа 2011

Когда последнему аргументу функции / метода предшествует символ &, ruby ​​ожидает объект proc.Вот почему вывод puts такой, какой он есть.

В этом блоге есть статья об унарном & операторе.

...