$0
là biến cho chương trình Ruby cấp cao nhất, nhưng có một biến cho phương thức hiện tại không?
$0
là biến cho chương trình Ruby cấp cao nhất, nhưng có một biến cho phương thức hiện tại không?
Câu trả lời:
Thậm chí tốt hơn câu trả lời đầu tiên của tôi, bạn có thể sử dụng __method__:
class Foo
def test_method
__method__
end
end
Điều này trả về một biểu tượng - ví dụ , :test_method
. Để trả về tên phương thức dưới dạng chuỗi, hãy gọi __method__.to_s
thay thế.
Lưu ý: Điều này đòi hỏi Ruby 1.8.7.
__method__.to_s
và nó sẽ là tên phương thức, không có gì khác
Từ http://snippets.dzone.com/posts/show/2785 :
module Kernel
private
def this_method_name
caller[0] =~ /`([^']*)'/ and $1
end
end
class Foo
def test_method
this_method_name
end
end
puts Foo.new.test_method # => test_method
__callee__
làm điều này?
Tùy thuộc vào những gì bạn thực sự muốn, bạn có thể sử dụng __method__
hoặc __callee__
trả về tên của phương thức hiện đang thực thi làm biểu tượng.
Trên ruby 1.9, cả hai đều hành xử giống hệt nhau (theo như các tài liệu và thử nghiệm của tôi có liên quan).
Trên ruby 2.1 & 2.2 __callee__
hoạt động khác đi nếu bạn gọi bí danh của phương thức đã xác định. Các tài liệu cho hai là khác nhau:
__method__
: "tên theo định nghĩa của phương thức hiện tại" (nghĩa là tên như được định nghĩa)__callee__
: "tên được gọi của phương thức hiện tại" (tức là tên như được gọi (được gọi))Kịch bản thử nghiệm:
require 'pp'
puts RUBY_VERSION
class Foo
def orig
{callee: __callee__, method: __method__}
end
alias_method :myalias, :orig
end
pp( {call_orig: Foo.new.orig, call_alias: Foo.new.myalias} )
1.9.3 Đầu ra:
1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:orig, :method=>:orig}}
2.1.2 Đầu ra ( __callee__
trả về tên bí danh, nhưng __method__
trả về tên tại điểm phương thức được xác định):
2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:myalias, :method=>:orig}}
Đối với Ruby 1.9+ tôi khuyên bạn nên sử dụng __callee__
__callee__
cư xử khác nhau trước 1.9, vì vậy tốt nhất bạn nên tuân thủ __method__
vì nó có hành vi nhất quán. __callee__
hành xử giống như __method__
sau 1.9.
def m1() puts("here is #{__method__} method. My caller is #{__callee__}.") end; def m2() puts("here is #{__method__} method. Let's call m1"); m1 end; m2
Bạn không thấy gì lạ à?
__callee__
và __method__
có hành vi khác nhau. Xem pastie.org/10380985 (ruby 2.1.5)
Tôi gặp vấn đề tương tự để lấy tên phương thức trong tệp xem. Tôi đã có giải pháp bằng cách
params[:action] # it will return method's name
nếu bạn muốn lấy tên của trình điều khiển thì
params[:controller] # it will return you controller's name
super
có thể được gọi trong một đối tượng SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end