รับชื่อของวิธีการดำเนินการในปัจจุบัน


198

$0 เป็นตัวแปรสำหรับโปรแกรม Ruby ระดับบนสุด แต่มีวิธีหนึ่งสำหรับวิธีปัจจุบันหรือไม่


หนึ่งคือการตรวจสอบการใช้งานsuperสามารถเรียกได้ว่าภายในวัตถุ SimpleDelegator:def description; __getobj__.respond_to?(__method__) ? super : 'No description'; end
คริส

คำตอบ:


334

ดียิ่งกว่าคำตอบแรกของฉันคุณสามารถใช้ __method__:

class Foo
  def test_method
    __method__
  end
end

นี้จะส่งกลับสัญลักษณ์ - :test_methodยกตัวอย่างเช่น หากต้องการส่งคืนชื่อเมธอดเป็นสตริงให้โทร__method__.to_sแทน

หมายเหตุ:ต้องใช้ Ruby 1.8.7


11
':' เป็นเพียงสัญลักษณ์สัญลักษณ์ :) เพิ่งทำ__method__.to_sแล้วมันจะเป็นชื่อวิธีการไม่มีอะไรอื่น
Lambart

เกิดอะไรขึ้นถ้าฉันอยู่ในภารกิจคราด?
Imran Ahmad

24

จาก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

5
นี่เป็นประโยชน์อย่างมากสำหรับฉันในการค้นหาชื่อของวิธีการโทร (ตรงข้ามกับวิธีปัจจุบัน)
Lambart

ไม่__callee__ทำเช่นนี้?
Joshua Pinter

Great solution Mark ทางออกที่ดีที่สุดในตอนนี้ ทำได้ดีมาก
jonathanccalix ถึง

18

ขึ้นอยู่กับสิ่งที่คุณต้องการจริง ๆ คุณสามารถใช้อย่างใดอย่างหนึ่ง__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}}

10

สำหรับ Ruby 1.9+ ฉันขอแนะนำให้ใช้ __callee__


3
__callee__มีพฤติกรรมแตกต่างไปก่อนหน้า 1.9 ดังนั้นจึงเป็นการดีที่สุดที่จะใช้__method__เนื่องจากมีพฤติกรรมที่สอดคล้องกัน __callee__ทำงานเหมือนกับ__method__1.9 หลังจาก
Leigh McCulloch

@LeighMcCulloch คุณสามารถอธิบายความแตกต่างด้วยตัวอย่าง (อาจเป็นคำตอบใหม่)?
Ciro Santilli 郝海东冠状病六四事件法轮功

@CiroSantilli 六四事件法轮功纳米比亚威视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คุณไม่เห็นอะไรแปลก ๆ เหรอ?
jgburet

4
@LeighMcCulloch จริงๆแล้วตอนนี้__callee__และ__method__มีพฤติกรรมที่แตกต่างกัน ดูpastie.org/10380985 (ทับทิม 2.1.5)
goodniceweb

1
pastie.org หยุดทำงาน ตลอดกาลหรือแค่ตอนนี้
Nakilon

-3

ฉันมีปัญหาเดียวกันในการดึงชื่อเมธอดในไฟล์มุมมอง ฉันได้วิธีแก้ปัญหาโดย

params[:action] # it will return method's name

ถ้าคุณต้องการรับชื่อคอนโทรลเลอร์

params[:controller] # it will return you controller's name

4
ฉันคิดว่าคุณตีความคำถามผิดเกี่ยวกับการทำงานของตัวควบคุมราง & วิธี HTTP ... คำตอบนี้น่าจะถูกลบ
Factor Mystic

มีประโยชน์สำหรับการรับชื่อของวิธีการดำเนินการ (ตัวควบคุม) ในปัจจุบันจากมุมมอง
avjaarsveld
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.