หากคุณกำลังเรียนรู้ Ruby คุณอาจพบว่าการใช้คำหลัก "ตัวเอง" นั้นสับสนมาก
มันทำงานอย่างไร?
self
คืออะไร ใช่ไหม
มันคือ คำหลักทับทิม ที่ให้คุณเข้าถึงวัตถุปัจจุบันได้
หากคุณไม่รู้ว่าสิ่งของคืออะไร ให้ดูวิดีโอนี้ที่ฉันทำเพื่อคุณ มันเกี่ยวข้องกับการเขียนโปรแกรมเชิงวัตถุ
“วัตถุปัจจุบัน” นี้ขึ้นอยู่กับบริบท
บริบท?
ใช่ บริบทคือที่ที่โค้ดของคุณอยู่ในช่วงเวลาที่กำหนด
นี่คือตัวอย่าง :
หากโค้ดของคุณอยู่ในเมธอดของอินสแตนซ์ self
เป็น ตัวอย่าง ของชั้นเรียนนั้นๆ กล่าวอีกนัยหนึ่ง self
เป็นวัตถุ
คุณสามารถเห็นสิ่งนี้ได้ด้วยตัวคุณเอง
เรียกใช้รหัสนี้ :
def coffee puts self end coffee # main
รหัสนี้กำหนดและเรียก coffee
วิธีการพิมพ์ค่าของ self
.
ทำไมมันถึงพิมพ์ main
?
เนื่องจากเป็นชื่อของออบเจ็กต์ระดับบนสุด จึงเป็นออบเจ็กต์ที่คุณจะพบวิธีการทั้งหมดที่กำหนดไว้ภายนอก ชั้นเรียน
ชอบ coffee
. ของเรา วิธีการที่นี่
แต่ถ้าคุณกำหนดเมธอดภายในคลาสชื่อ Cat
แล้ว self
จะเป็น Cat
วัตถุ
ดังที่เห็นที่นี่ :
class Cat def meow puts self end end Cat.new.meow # <Cat:0x7a14c5>
จากตัวอย่างเหล่านี้ เราสามารถบอกได้ว่าค่าของ self
เปลี่ยนแปลงขึ้นอยู่กับตำแหน่งที่คุณใช้
ตอนนี้ :
ฉันเชื่อว่าคุณสามารถเข้าใจทุกอย่างได้ดีขึ้นด้วยการทำความเข้าใจจุดประสงค์ของมัน
ทำไม self
มีประโยชน์ไหม
มาดูตัวอย่างกัน
ใช้ตนเองเพื่อแก้ความกำกวม
การใช้งานจริงอย่างหนึ่งสำหรับ self
คือสามารถบอกความแตกต่างระหว่าง method และ local variable ได้
ไม่ควรตั้งชื่อตัวแปรและวิธีการเหมือนกัน แต่ถ้าคุณต้องทำงานกับสถานการณ์นั้น คุณจะสามารถเรียกใช้เมธอดด้วย self.method_name
.
นี่คือสิ่งที่ฉันหมายถึง :
class Example def do_something banana = "variable" puts banana puts self.banana end def banana "method" end end Example.new.do_something # "variable" => puts banana # "method" => puts self.banana
เรามี banana
ตัวแปรท้องถิ่นภายใน do_something
แต่เราก็มี banana
วิธีการ
ตัวแปรโลคัลมีความสำคัญ
เราจึงต้องใช้ self
ที่นี่ถ้าเราต้องการ โทร banana
วิธีการแทน การพิมพ์ คุณค่าของ banana
ตัวแปร
ถัดไป :
มาดูกรณีการใช้งานทั่วไปกันดีกว่า… การกำหนดวิธีการของคลาส!
การใช้ตนเองเพื่อกำหนดวิธีการระดับชั้นเรียน
หมายเลข ONE ใช้สำหรับ self
ไม่ต้องสงสัยเลยคือการกำหนดวิธีการระดับคลาส
ฉันแน่ใจว่าคุณเคยเห็นพวกเขา
def self.method_name
These เหล่านี้ วิธีการ คำจำกัดความ .
ถูกใจสิ่งนี้ :
class Salad def self.buy_olive_oil # ... end end Salad.buy_olive_oil
นี้ self
นี่เทียบเท่ากับ Salad
, ชื่อคลาส
เหตุใดจึงมีประโยชน์
เนื่องจากเราไม่จำเป็นต้องใช้ชื่อคลาสสำหรับนิยามเมธอดแต่ละอัน ทำให้โค้ดของเราเปลี่ยนได้ง่ายขึ้นหากเราเปลี่ยนคลาส
นอกจากนี้ยังทำให้โค้ดมีเสียงดังน้อยลงและอ่านได้ดีขึ้น
นั่นเป็นเหตุผลที่เราทำ def self.buy_olive_oil
แทน def Salad.buy_olive_oil
.
การใช้งานอื่นๆ สำหรับตนเอง
ใช่!
มีประโยชน์มากขึ้นสำหรับ self
ดังนั้นจึงเป็นประโยชน์ที่ควรทำความคุ้นเคย
ตัวอย่างเช่น :
คุณสามารถใช้ในวิธีการเปรียบเทียบวัตถุปัจจุบันกับวัตถุอื่นได้
อะไรประมาณนี้ :
def ==(other) self == other end
คุณยังสามารถใช้ self
เพื่อจุดประสงค์ในการดีบัก เพื่อค้นหาว่าคุณกำลังทำงานกับวัตถุใด
ถูกใจสิ่งนี้ :
p self
หรือคุณสามารถใช้เป็นค่าส่งคืนเพื่อใช้รูปแบบการออกแบบ เช่น Builder Design Pattern
ตัวอย่าง :
class Salad def initialize @ingredients = [] end def add_nuts @ingredients << :nuts self end end my_salad = Salad.new.add_nuts
โดยสรุป นี่คือรายการการใช้งานที่เป็นประโยชน์สำหรับตนเอง :
- กำหนดวิธีการระดับคลาส
- ใช้วิธีอินสแตนซ์เมื่อคุณมีตัวแปรในเครื่องที่มีชื่อเดียวกัน
- การคืนตัวตน (รูปแบบผู้สร้าง)
- การดีบัก
- การเปรียบเทียบวัตถุ (==)
- ตัวรับเริ่มต้นของการเรียกเมธอด
ตัวเอง vs ตัวเอง
อีกอย่างที่เราควรดูก่อนจะจบหัวข้อนี้
Kernel#itself
วิธีการ
เป็นวิธีการที่คุณสามารถเรียกใช้วัตถุ &วัตถุจะส่งคืนเอง
ตัวอย่าง :
[1,2,3,nil].select(&:itself) # [1, 2 ,3]
ตัวอย่างนี้กรอง nil
&false
ค่า
เข้าใจความแตกต่าง :
self
เป็นคีย์เวิร์ด ค่ามันขึ้นอยู่กับ ที่ไหน คุณใช้มันself
เป็นวิธีการ ค่ามันขึ้นอยู่กับ อะไร วัตถุที่คุณใช้บน (ใน1.itself
,1
เป็นวัตถุ)
หวังว่าจะเป็นประโยชน์
บทสรุป
คุณได้เรียนรู้เกี่ยวกับรูบี้คีย์เวิร์ดแล้ว มันคืออะไร ทำไมมันถึงมีประโยชน์ &วิธีใช้งาน
ตอนนี้ถึงตาคุณแล้วที่จะลองดู
ขอบคุณที่อ่าน! 🙂