Ba cách: send
/ call
/ eval
- và Điểm chuẩn của họ
Yêu cầu tiêu biểu (để tham khảo):
s= "hi man"
s.length #=> 6
Sử dụng send
s.send(:length) #=> 6
Sử dụng call
method_object = s.method(:length)
p method_object.call #=> 6
Sử dụng eval
eval "s.length" #=> 6
Điểm chuẩn
require "benchmark"
test = "hi man"
m = test.method(:length)
n = 100000
Benchmark.bmbm {|x|
x.report("call") { n.times { m.call } }
x.report("send") { n.times { test.send(:length) } }
x.report("eval") { n.times { eval "test.length" } }
}
... như bạn có thể thấy, khởi tạo một đối tượng phương thức là cách động nhanh nhất để gọi một phương thức, cũng nhận thấy việc sử dụng eval chậm như thế nào.
#######################################
##### The results
#######################################
#Rehearsal ----------------------------------------
#call 0.050000 0.020000 0.070000 ( 0.077915)
#send 0.080000 0.000000 0.080000 ( 0.086071)
#eval 0.360000 0.040000 0.400000 ( 0.405647)
#------------------------------- total: 0.550000sec
# user system total real
#call 0.050000 0.020000 0.070000 ( 0.072041)
#send 0.070000 0.000000 0.070000 ( 0.077674)
#eval 0.370000 0.020000 0.390000 ( 0.399442)
Tín dụng vào bài đăng trên blog này , chi tiết hơn một chút về ba phương thức và cũng chỉ ra cách kiểm tra xem các phương thức có tồn tại hay không.