How to change the owner of a method in a block?

  • Thread starter Iñaki Baz Castillo
  • Start date
I

Iñaki Baz Castillo

SGksIGxldCBtZSBleHBsYWluIHdpdGggdGhpcyBzaW1wbGUgY29kZToKCi0tLS0tLS0tLS0tLS0t
LS0tLS0tCmNsYXNzIEEKCglkZWYgaW5pdGlhbGl6ZSgmYmxrKQoJCWJsay5jYWxsCgllbmQKCglk
ZWYgaGVsbG8KCQlwdXRzICJIRUxMTyAhISEiCgllbmQKCmVuZAoKYT1BLm5ldyB7IGhlbGxvKCkg
fQoKPT4gYmxvY2tfMS5yYjoxMzogdW5kZWZpbmVkIG1ldGhvZCBgaGVsbG8nIGZvciBtYWluOk9i
amVjdCAoTm9NZXRob2RFcnJvcikKICAgICAgICBmcm9tIGJsb2NrXzEucmI6NDppbiBgY2FsbCcK
ICAgICAgICBmcm9tIGJsb2NrXzEucmI6NDppbiBgaW5pdGlhbGl6ZScKICAgICAgICBmcm9tIGJs
b2NrXzEucmI6MTM6aW4gYG5ldycKICAgICAgICBmcm9tIGJsb2NrXzEucmI6MTMKLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoKSSB1bmRlcnN0YW5kIHBlcmZlY3RseSB3aGF0IG9j
Y3VyczogV2hlbiBwYXNzaW5nICJoZWxsbygpIiBpbiBhIGJsb2NrLAppdCdzIGxpa2UgaWYgdGhl
IGN1cnJlbnQgb2JqZWN0IGlzICJtYWluOk9iamVjdCIsIGZvciB3aGljaCB0aGVyZSBpcwpubyAi
aGVsbG8iIG1ldGhvZCAob2YgY291cnNlKS4KCldlbGwsIEknZCBsaWtlIHRoYXQgImhlbGxvKCki
IHdvdWxkIGJlIHJ1bm5lZCBhcyBjbGFzcyBBIGluc3RhbmNlCm1ldGhvZC4gSXMgaXQgcG9zc2li
bGUgaXMgc29tZSBlbGxlZ2FudCB3YXk/CgpUaGFua3MgYSBsb3QuCgoKLS0gCknDsWFraSBCYXog
Q2FzdGlsbG8KPGliY0BhbGlheC5uZXQ+Cg==
 
L

Lex Williams

Lex said:
one way would be to use instance_eval :

def new(&blk)
instance_eval &blk
end

I meant to write :

def initialize(&blk)
instance_eval &blk
end

too much java can get you high .
 
I

Iñaki Baz Castillo

MjAwOC85LzEwLCBMZXggV2lsbGlhbXMgPGV0YWVybkB5YWhvby5jb20+Ogo+IExleCBXaWxsaWFt
cyB3cm90ZToKPiAgPiBvbmUgd2F5IHdvdWxkIGJlIHRvIHVzZSBpbnN0YW5jZV9ldmFsIDoKPiAg
Pgo+ICA+IGRlZiBuZXcoJmJsaykKPiAgPiAgICBpbnN0YW5jZV9ldmFsICZibGsKPiAgPiBlbmQK
Pgo+ICBJIG1lYW50IHRvIHdyaXRlIDoKPgo+ICAgZGVmIGluaXRpYWxpemUoJmJsaykKPiAgICAg
aW5zdGFuY2VfZXZhbCAmYmxrCj4gICBlbmQKClJlYWxseSBncmVhdCA6KQoKTGV0IG1lIGp1c3Qg
YSBxdWVzdGlvbjogaG93IGRvZXMgYWZmZWN0IHVzaW5nICJpbnN0YW5jZV9ldmFsIiBpbgpwZXJm
b3JtYW5jZT8gSSd2ZSBkb25lIHNvbWUgc2ltcGxlIHRlc3RzOgoKPj4gQmVuY2htYXJrLnJlYWx0
aW1lIHsgYT0xMjM7IGEyPWEqMjsgYTM9YSozIH0KIyA9PiAxLjk3ODg3NDIwNjU0Mjk3ZS0wNQo+
PiBCZW5jaG1hcmsucmVhbHRpbWUgeyBpbnN0YW5jZV9ldmFsICdhPTEyMzsgYTI9YSoyOyBhMz1h
KjMnIH0KIyA9PiA0LjUwNjExMTE0NTAxOTUzZS0wNQoKCldlbGwsIGl0IHNlZW1zIHRoYXQgdXNp
bmcgImluc3RhbmNlX2V2YWwiIHRha2VzIHRoZSBkb3VibGUgb2YgdGltZQp0aGFuIHJ1bm5pbmcg
dGhlIGNvZGUgZGlyZWN0bHkuIElzIGl0IHNpZ25pZmljYW50PwoKVGhhbmtzLgoKCgoKCi0tIApJ
w7Fha2kgQmF6IENhc3RpbGxvCjxpYmNAYWxpYXgubmV0Pgo=
 
P

Peña, Botp

RnJvbTogScOxYWtpIEJheiBDYXN0aWxsbyBbbWFpbHRvOmliY0BhbGlheC5uZXRdIA0KIyA+PiBC
ZW5jaG1hcmsucmVhbHRpbWUgeyBpbnN0YW5jZV9ldmFsICdhPTEyMzsgYTI9YSoyOyBhMz1hKjMn
IH0NCiMgIyA9PiA0LjUwNjExMTE0NTAxOTUzZS0wNQ0KDQp0aGF0J3MgYSBzdHJpbmcuDQoNCmlu
Y2x1ZGUgYSBibG9jaywgZWcNCg0KPiBCZW5jaG1hcmsucmVhbHRpbWUgeyBhPTEyMzsgYTI9YSoy
OyBhMz1hKjMgfQ0KPT4gMS41OTc0MDQ0Nzk5ODA0N2UtMDUNCg0KPiBCZW5jaG1hcmsucmVhbHRp
bWUgeyBpbnN0YW5jZV9ldmFsICdhPTEyMzsgYTI9YSoyOyBhMz1hKjMnIH0NCj0+IDcuNTgxNzEw
ODE1NDI5NjllLTA1DQoNCj4gQmVuY2htYXJrLnJlYWx0aW1lIHsgaW5zdGFuY2VfZXZhbCB7YT0x
MjM7IGEyPWEqMjsgYTM9YSozfSB9DQo9PiAyLjI4ODgxODM1OTM3NWUtMDUNCg==
 
I

Iñaki Baz Castillo

MjAwOC85LzEwLCBQZcOxYSwgQm90cCA8Ym90cEBkZWxtb250ZS1waGlsLmNvbT46Cj4gRnJvbTog
ScOxYWtpIEJheiBDYXN0aWxsbyBbbWFpbHRvOmliY0BhbGlheC5uZXRdCj4gICMgPj4gQmVuY2ht
YXJrLnJlYWx0aW1lIHsgaW5zdGFuY2VfZXZhbCAnYT0xMjM7IGEyPWEqMjsgYTM9YSozJyB9Cj4g
ICMgIyA9PiA0LjUwNjExMTE0NTAxOTUzZS0wNQo+Cj4gIHRoYXQncyBhIHN0cmluZy4KPgo+ICBp
bmNsdWRlIGEgYmxvY2ssIGVnCj4KPgo+ICA+IEJlbmNobWFyay5yZWFsdGltZSB7IGE9MTIzOyBh
Mj1hKjI7IGEzPWEqMyB9Cj4KPiA9PiAxLjU5NzQwNDQ3OTk4MDQ3ZS0wNQo+Cj4KPiAgPiBCZW5j
aG1hcmsucmVhbHRpbWUgeyBpbnN0YW5jZV9ldmFsICdhPTEyMzsgYTI9YSoyOyBhMz1hKjMnIH0K
Pgo+ID0+IDcuNTgxNzEwODE1NDI5NjllLTA1Cj4KPgo+ICA+IEJlbmNobWFyay5yZWFsdGltZSB7
IGluc3RhbmNlX2V2YWwge2E9MTIzOyBhMj1hKjI7IGEzPWEqM30gfQo+Cj4gPT4gMi4yODg4MTgz
NTkzNzVlLTA1CgoKWW91IGFyZSByaWdodCEKU28gdXNpbmcgImluc3RhbmNlX2V2YWwiIGlzIH4g
IDQwJSBzbG93ZXIgdGhhbiBydW5uaW5nIGRpcmVjdGx5IHRoZSBjb2RlLgoKVGhhbmtzIGEgbG90
LgoKCi0tIApJw7Fha2kgQmF6IENhc3RpbGxvCjxpYmNAYWxpYXgubmV0Pgo=
 
B

botp

So using "instance_eval" is ~ 40% slower than running directly the code.

well, we can try again :)

botp@jedi-hopeful:~$ cat test.rb
require 'benchmark'
n=3D100_000
Benchmark.bmbm do |x|
x.report("normal") { n.times { a=3Dnil;a=3D123; a2=3Da*2; a3=3Da*3 }}
x.report("string") { n.times {instance_eval 'a=3Dnil;a=3D123; a2=3Da*2; a=
3=3Da*3' }}
x.report("block") { n.times {instance_eval {a=3Dnil;a=3D123; a2=3Da*2; a3=
=3Da*3} }}
x.report("block-broken") { n.times {a=3Dnil;instance_eval{a=3D123};
instance_eval{ a2=3Da*2};
instance_eval{a3=3Da*3}
}
}
end




botp@jedi-hopeful:~$ ruby test.rb
Rehearsal ------------------------------------------------
normal 0.140000 0.000000 0.140000 ( 0.247775)
string 2.420000 0.010000 2.430000 ( 3.438391)
block 0.250000 0.000000 0.250000 ( 0.375656)
block-broken 0.470000 0.010000 0.480000 ( 0.698093)
--------------------------------------- total: 3.300000sec

user system total real
normal 0.120000 0.000000 0.120000 ( 0.216789)
string 2.480000 0.020000 2.500000 ( 3.291342)
block 0.300000 0.000000 0.300000 ( 0.423327)
block-broken 0.490000 0.000000 0.490000 ( 0.703046)
botp@jedi-hopeful:~$


slower but not slow (in my own mileage :)
or optimistically, direct code is faster than a code block
 
I

Iñaki Baz Castillo

El Jueves, 11 de Septiembre de 2008, botp escribi=F3:
e.

well, we can try again :)

botp@jedi-hopeful:~$ cat test.rb
require 'benchmark'
n=3D100_000
Benchmark.bmbm do |x|
x.report("normal") { n.times { a=3Dnil;a=3D123; a2=3Da*2; a3=3Da*3 }}
x.report("string") { n.times {instance_eval 'a=3Dnil;a=3D123; a2=3Da*2;= a3=3Da*3'
}} x.report("block") { n.times {instance_eval {a=3Dnil;a=3D123; a2=3Da*2;= a3=3Da*3}
}} x.report("block-broken") { n.times {a=3Dnil;instance_eval{a=3D123};
instance_eval{ a2=3Da*2};
instance_eval{a3=3Da*3}
}
}
end




botp@jedi-hopeful:~$ ruby test.rb
Rehearsal ------------------------------------------------
normal 0.140000 0.000000 0.140000 ( 0.247775)
string 2.420000 0.010000 2.430000 ( 3.438391)
block 0.250000 0.000000 0.250000 ( 0.375656)
block-broken 0.470000 0.010000 0.480000 ( 0.698093)
--------------------------------------- total: 3.300000sec

user system total real
normal 0.120000 0.000000 0.120000 ( 0.216789)
string 2.480000 0.020000 2.500000 ( 3.291342)
block 0.300000 0.000000 0.300000 ( 0.423327)
block-broken 0.490000 0.000000 0.490000 ( 0.703046)
botp@jedi-hopeful:~$


slower but not slow (in my own mileage :)
or optimistically, direct code is faster than a code block

Good comparision, thanks :)

=2D-=20
I=F1aki Baz Castillo
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,764
Messages
2,569,564
Members
45,040
Latest member
papereejit

Latest Threads

Top