Ruby block, procs and instance_eval

Viewed 10975

I recently tried to do something akin to this:

a = "some string"
b = Proc.new{ upcase }
a.instance_eval b

Which gives the error:

TypeError: can't convert Proc into String

but this works:

def b(&block)
  "some string".instance_eval &block
end

b{ upcase }

A further look with this method:

def b(&block)
  "some string".instance_eval block
end

Yields the same Proc to String error.

So... my understanding of blocks is that they are just procs. But there's obviously something special about having this & ampersand...

Can someone explain this to me? Is it possible to convert a normal proc to be whatever it is that is special about this &block object?

edit

Just figured out my second question, prepend an & to the proc... that was easy, but WHAT is this really doing?

5 Answers
Related