Tôi biết phương thức lớp cho biết tên của lớp của đối tượng là gì, làm cách nào tôi có thể biết tên của phương thức gọi? Có cách nào để biết điều đó không?Có cách nào để biết phương pháp gọi không?
Trả lời
Examining the Ruby Call Stack chia sẻ thông tin này:
Bạn đã bao giờ muốn nhìn vào các cuộc gọi stack mà không tăng một ngoại lệ để làm điều đó?
caller.each {|c| puts c}
người gọi là phương pháp kernal cho phép bạn thực hiện việc này, vì vậy người gọi [0] sẽ cho bạn biết người gọi ngay lập tức của hàm.
một hack nhanh chóng để có được chỉ có tên của hàm có thể là
caller[0][/`\S+/].chop[1..-1]
này sẽ trả lại tên của phương pháp gọi điện thoại như một String, mà sau đó bạn có thể sử dụng tuy nhiên bạn muốn
Ruby việc thực hiện Kernel#caller
đã được thực hiện với String
s vì lý do hiệu suất và thu gom rác thải. Nếu bạn muốn làm phân tích cuộc gọi stack tinh vi hơn, hãy xem bài viết trên blog này:
http://eigenclass.org/hiki/ruby+backtrace+data
Tác giả đi qua hai triển khai khác nhau của một cuộc gọi đồ thị dưới đống đối tượng tốt hơn, một trong những thực hiện trong tinh khiết Ruby với các (không được biết đến rộng rãi) phương pháp Kernel#set_trace_func
và phương pháp khác hoạt động như phần mở rộng C cho MRI.
Ứng dụng sản xuất không được sử dụng bất kỳ điều gì khác ngoài triển khai Kernel#caller
đi kèm với Ruby. Nếu bạn sử dụng các phần mở rộng ở trên rộng rãi, bạn có thể sẽ giết chết khả năng thu gom rác của Ruby một cách hiệu quả và làm chậm quá trình của bạn (tôi ước tính) lên đến vài đơn vị độ lớn.
Bạn có thể viết một cái gì đó như thế này:
module Kernel
private
def who_is_calling? # Or maybe def who_just_called?
caller[1] =~ /`([^']*)'/ and $1
end
end
Và sau đó bạn có những thử nghiệm nhỏ:
irb(main):056:0* def this_is_a_method
irb(main):057:1> puts "I, 'this_is_a_method', was called upon by: '#{who_is_calling?}'"
irb(main):058:1> end
=> nil
irb(main):059:0> def this_is_a_method_that_calls_another
irb(main):060:1> this_is_a_method
irb(main):061:1> end
=> nil
irb(main):062:0> this_is_a_method_that_calls_another
I, 'this_is_a_method', was called upon by: 'this_is_a_method_that_calls_another'
=> nil
irb(main):063:0> this_is_a_method
I, 'this_is_a_method', was called upon by: 'irb_binding'
=> nil
irb(main):064:0>
Không rằng đây không phải là một câu hỏi hợp lệ và tất cả, nhưng cần phải nhìn vào các cuộc gọi ngăn xếp thường có nghĩa là bạn đang làm điều gì đó sai. –