$0
เป็นตัวแปรสำหรับโปรแกรม Ruby ระดับบนสุด แต่มีวิธีหนึ่งสำหรับวิธีปัจจุบันหรือไม่
$0
เป็นตัวแปรสำหรับโปรแกรม Ruby ระดับบนสุด แต่มีวิธีหนึ่งสำหรับวิธีปัจจุบันหรือไม่
คำตอบ:
ดียิ่งกว่าคำตอบแรกของฉันคุณสามารถใช้ __method__:
class Foo
def test_method
__method__
end
end
นี้จะส่งกลับสัญลักษณ์ - :test_method
ยกตัวอย่างเช่น หากต้องการส่งคืนชื่อเมธอดเป็นสตริงให้โทร__method__.to_s
แทน
หมายเหตุ:ต้องใช้ Ruby 1.8.7
__method__.to_s
แล้วมันจะเป็นชื่อวิธีการไม่มีอะไรอื่น
จาก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__
ทำเช่นนี้?
ขึ้นอยู่กับสิ่งที่คุณต้องการจริง ๆ คุณสามารถใช้อย่างใดอย่างหนึ่ง__method__
หรือ__callee__
ซึ่งส่งกลับชื่อของวิธีการดำเนินการในปัจจุบันเป็นสัญลักษณ์
ในทับทิม 1.9 ทั้งคู่มีพฤติกรรมเหมือนกัน (เท่าที่เอกสารและการทดสอบของฉันเกี่ยวข้อง)
On ruby 2.1 & 2.2 __callee__
จะทำงานแตกต่างกันหากคุณเรียกใช้ alias ของวิธีที่กำหนดไว้ เอกสารสำหรับทั้งสองแตกต่างกัน:
__method__
: "ชื่อที่นิยามของวิธีการปัจจุบัน" (เช่นชื่อตามที่กำหนด)__callee__
: "ชื่อที่เรียกของวิธีปัจจุบัน" (เช่นชื่อที่ถูกเรียก (เรียกใช้))สคริปต์ทดสอบ:
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 ผลลัพธ์:
1.9.3
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:orig, :method=>:orig}}
2.1.2 เอาต์พุต ( __callee__
ส่งคืนชื่อ aliased แต่__method__
ส่งคืนชื่อที่จุดที่วิธีการกำหนดไว้):
2.1.2
{:call_orig=>{:callee=>:orig, :method=>:orig},
:call_alias=>{:callee=>:myalias, :method=>:orig}}
สำหรับ Ruby 1.9+ ฉันขอแนะนำให้ใช้ __callee__
__callee__
มีพฤติกรรมแตกต่างไปก่อนหน้า 1.9 ดังนั้นจึงเป็นการดีที่สุดที่จะใช้__method__
เนื่องจากมีพฤติกรรมที่สอดคล้องกัน __callee__
ทำงานเหมือนกับ__method__
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
คุณไม่เห็นอะไรแปลก ๆ เหรอ?
__callee__
และ__method__
มีพฤติกรรมที่แตกต่างกัน ดูpastie.org/10380985 (ทับทิม 2.1.5)
ฉันมีปัญหาเดียวกันในการดึงชื่อเมธอดในไฟล์มุมมอง ฉันได้วิธีแก้ปัญหาโดย
params[:action] # it will return method's name
ถ้าคุณต้องการรับชื่อคอนโทรลเลอร์
params[:controller] # it will return you controller's name
super
สามารถเรียกได้ว่าภายในวัตถุ SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end