From the fine manual:
send(symbol [, args...]) → obj
send(string [, args...]) → obj
Invokes the method identified by symbol, passing it any arguments specified. [...] When the method is identified by a string, the string is converted to a symbol.
and for instance_eval
:
instance_eval(string [, filename [, lineno]] ) → obj
instance_eval {| | block } → obj
Evaluates a string containing Ruby source code, or the given block, within the context of the receiver (obj). In order to set the context, the variable self
is set to obj while the code is executing, giving the code access to obj’s instance variables.
So send
executes a method whereas instance_eval
executes an arbitrary block of code (as a string or block) with self
set to the object that you're calling instance_eval
on.
In your case, there isn't much difference as the string you're handing to instance_eval
is just a single method. The main difference is that anyone reading your code (including you in six months) will be wondering why you're using instance_eval
to call a single method.
You might also be interested in Object#public_send
and BasicObject#__send__