Ruby dinamik arama yöntemi
Üç yolu vardır bildiğim kadarıyla dinamik olarak Ruby yöntemi:
Yöntem 1:
s = SomeObject.new
method = s.method(:dynamic_method)
method.call
Yöntem 2:
s = SomeObject.new
s.send(:dynamic_method)
Yöntem 3:
s = SomeObject.new
eval "s.dynamic_method"
Onları kıyaslama Yöntem 1 yavaştır bugüne kadar en hızlı Yöntem 2 olduğunu tespit ettim ve Yöntem 3 farkla yavaş.
Ayrıca .call
.send
eval
yok iken özel yöntemler arayarak, izin bulduk.
Benim sorum ise şu: herhangi bir nedenle hiç .send
eval
var mı acaba? Neden her zaman en hızlı yöntemi kullanmak istemez misiniz? Diğer farklar dinamik yöntem çağırma bu yöntemler nedir?
CEVAP
herhangi bir nedenle hiç
send
var mı acaba?
call
nesne, 26* *gelmez bir yönteme ihtiyacı var:
class Foo
def method_missing(name)
"#{name} called"
end
end
Foo.new.send(:bar) #=> "bar called"
Foo.new.method(:bar).call #=> undefined method `bar' for class `Foo' (NameError)
herhangi bir nedenle hiç
eval
var mı acaba?
eval
keyfi ifadeler, sadece bir yöntemi çağırmak için değil değerlendirir.
İlişkin kriterler send
* call
*21 daha hızlı gibi görünüyor:
require 'benchmark'
class Foo
def bar; end
end
Benchmark.bm(4) do |b|
b.report("send") { 1_000_000.times { Foo.new.send(:bar) } }
b.report("call") { 1_000_000.times { Foo.new.method(:bar).call } }
end
Sonuç:
user system total real
send 0.210000 0.000000 0.210000 ( 0.215181)
call 0.740000 0.000000 0.740000 ( 0.739262)
Ruby: örneği Arama sınıf yöntemi...
Objective C arama yöntemi dinamik bir ...
# - C Derleme Yüklenemedi Yol Doğru, S...
Geçen ruby'de bir yöntemi parametre ol...
Bir geri arama yöntemi olarak kullanma...