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?
All you have to do for your first example to work is this:
The reason is that
instance_evalneeds either a string or a block and the ampersand provides the latter.