On Fri, Jul 6, 2012 at 12:17 PM, Rodrigo Rosenfeld Rosas
<[email protected]> wrote:
> myLongListNameIDontWantToRepeat.tap do |l|
> l.psize
> l.add 10
> l.psize
> ...
> end
I was going to suggest #tap myself, but I realized it's not as "bare"
as instance_eval/exec. It is certainly unfortunate that
instance_eval/exec cause a singleton object to come into existence
immediately. Unfortunately if they do not any method definitions fail
in a horrible way: they define themselves on the actual class.
It is possible to define a "new" instance_eval that uses a dummy
class, so that definitions fail immediately, for DSL purposes...
irb(main):001:0> s = 'foo'
=> "foo"
irb(main):002:0> s.instance_exec_light { puts to_s }
foo
=> nil
irb(main):003:0> s.instance_exec_light { def foo; end }
TypeError: no class/module to add method
from (irb):3:in `evaluate'
from org/jruby/RubyBasicObject.java:1846:in `instance_exec_light'
from (irb):3:in `evaluate'
from org/jruby/RubyKernel.java:1045:in `eval'
from org/jruby/RubyKernel.java:1361:in `loop'
from org/jruby/RubyKernel.java:1154:in `catch'
from org/jruby/RubyKernel.java:1154:in `catch'
from /Users/headius/projects/jruby/bin/jirb:13:in `(root)'
This "instance_exec_light" does not create a singleton object, and as
a result it is massively faster (and doesn't have the same Java
integration problems) :
system ~/projects/jruby $ jruby -rbenchmark -e "5.times { puts
Benchmark.measure { 1000000.times { s = 'foo'; s.instance_exec { to_s
} } } }"
5.330000 0.340000 5.670000 ( 2.279000)
3.630000 0.330000 3.960000 ( 1.693000)
3.490000 0.350000 3.840000 ( 1.671000)
3.510000 0.330000 3.840000 ( 1.654000)
3.470000 0.330000 3.800000 ( 1.644000)
system ~/projects/jruby $ jruby -rbenchmark -e "5.times { puts
Benchmark.measure { 1000000.times { s = 'foo'; s.instance_exec_light {
to_s } } } }"
1.290000 0.050000 1.340000 ( 0.675000)
0.310000 0.020000 0.330000 ( 0.288000)
0.280000 0.020000 0.300000 ( 0.281000)
0.290000 0.030000 0.320000 ( 0.284000)
0.290000 0.020000 0.310000 ( 0.281000)
I don't know if such an idea would be accepted by Matz or ruby-core,
but it seems like a useful feature to me.
- Charlie
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email