 <p>The problem is that you've declared that the "<code>print_string</code>" method takes a block argument (confusingly named "<code>str</code>") and you simply print the proc itself. You'd probably like to call the given procedure to see the string value it returns:</p> <pre><code>def call_proc(&amp;proc) proc.call end call_proc { 'Foobar' } # =&gt; "Foobar" </code></pre> <p>What you've discovered is the syntax sugar that if you decorate the last argument of a method definition with an ampersand <code>&amp;</code> then it will be bound to the block argument to the method call. An alternative way of accomplishing the same task is as follows:</p> <pre><code>def call_proc2 yield if block_given? end call_proc2 { 'Example' } # =&gt; 'Example' </code></pre> <p>Note also that procedures can be handled directly as objects by using <a href="http://www.ruby-doc.org/core/classes/Proc.html" rel="nofollow"><code>Proc</code> objects</a> (or the "lambda" alias for the Proc constructor):</p> <pre><code>p1 = Proc.new { 'Foo' } p1.call # =&gt; "Foo" p2 = lambda { 'Bar' } p2.call # =&gt; "Bar" </code></pre>