หากคุณกำลังเรียนรู้ 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เป็นวัตถุ)
หวังว่าจะเป็นประโยชน์
บทสรุป
คุณได้เรียนรู้เกี่ยวกับรูบี้คีย์เวิร์ดแล้ว มันคืออะไร ทำไมมันถึงมีประโยชน์ &วิธีใช้งาน
ตอนนี้ถึงตาคุณแล้วที่จะลองดู
ขอบคุณที่อ่าน! 🙂