Issue #10095 has been updated by Tsuyoshi Sawada.


I think this feature is already realized by `instance_eval` given that it accepts an optional block parameter, but people do not want to use it because it is slow (and perhaps because its name is too long). The reason `instance_eval` is slow is because of the cost of switching the context. However, I don't see any reason it has to switch the context when a block parameter is given. I cannot think of a use case where one wants to access the receiver simultaneously through the switched `self` and the block parameter. Either one at a time is enough.

So, I would like to make a proposal such that, when `instance_eval` takes a block parameter, do not switch the context, and just pass the receiver through the block parameter. This will remove the slowness of the method in the relevant case, and provides the feature we want.

It is a backward incompatible change, but I suspect there are not much code that accesses the receiver through `self` and the block parameter at the same time.

----------------------------------------
Feature #10095: Object#as
https://bugs.ruby-lang.org/issues/10095#change-58358

* Author: Akira Matsuda
* Status: Open
* Priority: Normal
* Assignee: 
----------------------------------------
We've had so many times of feature requests for a method similar to Object#tap that doesn't return self but returns the given block's execution result (e.g. #7388, #6684, #6721 ).

I'm talking about something like this in Ruby of course:
Object.class_eval { def as() yield(self) end }

IIRC Matz is not against introducing this feature but he didn't like any of the names proposed in the past, such as embed, do, identity, ergo, reference, yield_self, itself, apply, map, tap!, etc.

So, let us propose a new name, Object#as today.
It's named from the aspect of the feature that it gives the receiver a new name "as" a block local variable.
For instance, the code reads so natural and intuitive like this:

(1 + 2 + 3 + 4).as {|x| x ** 2}
=> 100

Array.new.as {|a| a << 1; a << 2}
=> [1, 2]

---Files--------------------------------
itself-block.patch (1.35 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>