1

I know that this code may be not quite correct:

def print_string(&str)
puts str
end

print_string{"Abder-Rahman"}

But, when I run it, this is what I get:

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

What is this output?

Andrew Grimm
  • 78,473
  • 57
  • 200
  • 338
Simplicity
  • 47,404
  • 98
  • 256
  • 385

4 Answers4

5

That's the default string representation of a Proc object. Because "Abder-Rahman" is in braces, Ruby thinks you're defining a block. Did you mean to put str.call inside of your function definition? That should call your block and return the string expression you defined inside it.

plasticsaber
  • 232
  • 1
  • 4
4

The problem is that you've declared that the "print_string" method takes a block argument (confusingly named "str") and you simply print the proc itself. You'd probably like to call the given procedure to see the string value it returns:

def call_proc(&proc)
  proc.call
end
call_proc { 'Foobar' }
# => "Foobar"

What you've discovered is the syntax sugar that if you decorate the last argument of a method definition with an ampersand & then it will be bound to the block argument to the method call. An alternative way of accomplishing the same task is as follows:

def call_proc2
  yield if block_given?
end
call_proc2 { 'Example' }
# => 'Example'

Note also that procedures can be handled directly as objects by using Proc objects (or the "lambda" alias for the Proc constructor):

p1 = Proc.new { 'Foo' }
p1.call # => "Foo"
p2 = lambda { 'Bar' }
p2.call # => "Bar"
maerics
  • 151,642
  • 46
  • 269
  • 291
2

You're passing a block to the method, as denoted by the & prefix and how you're calling it. That block is then converted into a Proc internally.

puts str.call inside your method would print the string, although why you'd want to define the method this way is another matter.

See Proc: http://www.ruby-doc.org/core/classes/Proc.html

numbers1311407
  • 33,686
  • 9
  • 90
  • 92
0

When the last argument of function/method is preceded by the & character, ruby expect a proc object. So that's why puts's output is what it is.

This blog has an article about the unary & operator.

dee-see
  • 23,668
  • 5
  • 58
  • 91