Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

วิธีใช้คำนามแฝงทับทิม

คุณสามารถตั้งชื่ออื่นให้กับวิธี Ruby ได้สองวิธี:

  • นามแฝง (คำหลัก)
  • alias_method

เนื่องจากพวกเขาทำสิ่งเดียวกันในวิธีที่ต่างกันเล็กน้อย นี่อาจเป็นหัวข้อที่สับสนได้

รูปภาพนี้เป็นบทสรุปของความแตกต่าง :

วิธีใช้คำนามแฝงทับทิม

มาสำรวจความแตกต่างเหล่านี้โดยละเอียดเพื่อทำความเข้าใจ!

คีย์เวิร์ดนามแฝง

ก่อนอื่นเรามี alias ซึ่งเป็นคีย์เวิร์ด Ruby (เช่น if , def , class เป็นต้น)

หน้าตาเป็นแบบนี้ :

alias print_something puts

print_something 1

กำลังเรียก print_something เหมือนกับการเรียก puts .

เพราะ alias เป็นคำหลักที่มี คุณลักษณะที่น่าสนใจ :

  • มีไวยากรณ์พิเศษ
  • ใช้ได้ทุกที่ในโค้ดของคุณ
  • ชื่อแทนตัวแปรส่วนกลางได้ (อย่าทำเช่นนี้!)

รูปแบบนามแฝงที่ถูกต้องคือ :

  • นามแฝง a b
  • นามแฝง :a :b
  • นามแฝง :”#{}” :b

สังเกตว่า ไม่มีเครื่องหมายจุลภาคระหว่างอาร์กิวเมนต์ เหมือนในวิธีปกติ

Ruby คาดหวังทั้ง a &b เพื่อเป็นชื่อเมธอดที่ถูกต้อง ตัวแปรไม่ทำงานที่นี่ หากคุณต้องการใช้ตัวแปร คุณจะต้องทำสิ่งนี้…

ตัวอย่าง :

a = :print_something
b = :puts

alias :"#{a}" :"#{b}"

แต่มันดูน่าเกลียด ดังนั้นคุณอาจต้องการใช้ alias_method สำหรับชื่อเมธอดแบบไดนามิก

วิธีการ alias_method

ถัดไป:

เรามี alias_method ซึ่งเป็นวิธีการที่กำหนดไว้ใน Module .

คุณสามารถใช้วิธีนี้ได้ในระดับคลาส &โมดูล แต่ไม่สามารถใช้ภายในเมธอดของอินสแตนซ์ได้

นี่คือคำอธิบายจากเอกสาร :

alias_method:“ทำให้ new_name สำเนาใหม่ของวิธีการ old_name . สามารถใช้เพื่อรักษาการเข้าถึงวิธีการที่ถูกแทนที่”

ตัวอย่าง :

class Foo
  alias_method :print_something, :puts
end

นี่จะเป็นนามแฝง print_something เพื่อ puts ภายใน Foo .

คุณสามารถใช้สตริงเป็น alias_method ข้อโต้แย้ง

ตัวอย่าง :

class Foo
  alias_method "print_something", "puts"
end

นามแฝงเทียบกับ alias_method

คุณได้เห็นภาพรวมของ alias &alias_method .

แต่ความแตกต่างจะเกิดขึ้นเมื่อใด

  1. เมื่อคุณกำหนดนามแฝงสำหรับ ชื่อเมธอดที่สร้างขึ้นแบบไดนามิก (เช่น “abc#{rand}”)
  2. เมื่อคุณกำหนดนามแฝงภายในวิธีการ

การกำหนดนามแฝงสำหรับชื่อเมธอดที่สร้างขึ้นแบบไดนามิกสามารถทำได้ด้วย alias แต่ต้องใช้สัญลักษณ์แทรก

ด้วย alias_method คุณจะได้รับข้อโต้แย้งที่ยืดหยุ่นมากขึ้น

ตัวอย่าง :

class Cat
  def speak
    "meow"
  end

  alias_method "#{name.downcase}_speak", :speak
end

p Cat.new.cat_speak
# "meow"

ตอนนี้ :

หากคุณต้องการกำหนดนามแฝงภายในเมธอด คุณจะได้รับข้อผิดพลาดนี้:

undefined method 'alias_method' for # (NoMethodError)

เพราะคุณกำลังทำงานอยู่ในวัตถุ ไม่ใช่ชั้นเรียน!

ภายในเมธอดของอินสแตนซ์ คุณไม่มีสิทธิ์เข้าถึงเมธอดที่กำหนดไว้ใน Module ซึ่งเป็นที่ที่ alias_method ถูกกำหนดไว้แล้ว

นี่คือทางออกหนึ่งที่เป็นไปได้ :

def enable_aliased_methods
  self.class.send(:alias_method, :x, :testing)
end

การใช้ alias :

def enable_aliased_methods
  alias :x :testing
end

ความแตกต่างที่สำคัญประการหนึ่ง:

  • วิธีการที่กำหนดโดย alias จะอยู่ในคลาสที่ alias ถูกนำมาใช้
  • เมธอดที่กำหนดโดย alias_method จะเป็นของ self , คลาสปัจจุบันในขณะที่รันโค้ด

นี่คือเหตุผลที่สำคัญ:

หากคุณเรียกใช้เมธอดในคลาสพาเรนต์ที่ใช้ alias คีย์เวิร์ด…

นามแฝงจะเกิดขึ้นในคลาสหลักและไม่ใช่ในคลาสที่เรียกใช้เมธอด

ตัวอย่าง :

class Food
  def create_alias
    alias print_on_screen puts
  end
end

class Apple < Food
end

Apple.new.create_alias

แต่ถ้าคุณใช้ alias_method เมธอดจะใช้นามแฝงใน Apple . เท่านั้น .

นามแฝงสร้างสำเนาของวิธีการ

ตามคำอธิบายของ alias_method &alias (keyword) , Ruby สร้างสำเนาของวิธีการ

ไม่ใช่แค่ชื่อใหม่เท่านั้น

แต่ สำเนาของวิธีการจริง .

สิ่งนี้มีความหมายเชิงปฏิบัติบางประการ:

def bacon
  123
end

alias :x :bacon

x
# 123

bacon
# 123

เราจึงใช้นามแฝงว่า x ถึง bacon ตอนนี้ดูว่าเกิดอะไรขึ้นถ้าฉันกำหนด bacon :

def bacon
  234
end

x
# 123

bacon
# 234

x วิธียังคงเหมือนเดิม แต่ bacon คืนค่าใหม่!

อาจเป็นเรื่องที่น่าประหลาดใจหากคุณรวมโมดูลในชั้นเรียนของคุณหลังจากใช้วิธีนามแฝง

วิดีโอสอน

สรุป

โดยทั่วไปฉันชอบ alias_method . มากกว่า เพราะเป็นวิธีการจริง

ในขณะที่ alias คีย์เวิร์ดมีคุณสมบัติพิเศษบางอย่างที่คุณต้องจำและจำไว้

คุณได้เรียนรู้สิ่งใหม่หรือไม่?

แบ่งปันบทความนี้กับเพื่อน Ruby ของคุณเพื่อให้พวกเขาได้เรียนรู้เช่นกัน!