โครงสร้างในทับทิมคืออะไร
struct เป็นคลาส Ruby ในตัว ซึ่งใช้ในการสร้างคลาสใหม่ที่สร้างออบเจกต์มูลค่า วัตถุมูลค่าใช้เพื่อเก็บแอตทริบิวต์ที่เกี่ยวข้องไว้ด้วยกัน
นี่คือตัวอย่าง :
A Point
ที่มีสองพิกัด (x
&y
)
คุณสามารถแสดงข้อมูลนี้ได้หลายวิธี
ถูกใจ :
- อาร์เรย์
[10, 20]
- แฮช
{ x: 10, y: 10 }
- วัตถุ
Point.new(10, 20)
หากคุณกำลังจะมี Point
. มากกว่าหนึ่ง มักเป็นวิธีที่ดีในการใช้วิธีการแบบออบเจ็กต์
แต่…
คุณคงไม่อยากสร้างทั้งชั้นเรียนเพียงเพื่อเก็บค่าทั้งสองไว้ด้วยกัน!
การใช้ Struct
แก้ปัญหานี้ได้
สารบัญ
- 1 วิธีสร้างโครงสร้างใน Ruby
- 1.1 ทางเลือกอื่น
- 1.2 ผลประโยชน์มหาศาล
- 2 วิธีการใช้โครงสร้างทับทิม
- คำเตือน 3 ข้อ:โครงสร้างอาจเป็นเรื่องยุ่งยาก
- 3.1 อีกสิ่งแปลกประหลาด
- 4 พารามิเตอร์ที่มีชื่อใน Ruby 2.5
- 5 วิธีใช้ OpenStruct
- 6 โครงสร้างเทียบกับ OpenStruct
- 7 ดูวิดีโอการสอน
- 8 บทสรุป
- 8.1 ที่เกี่ยวข้อง
มาทำสิ่งนี้กันเถอะ!
วิธีสร้างโครงสร้างใน Ruby
คุณสามารถสร้าง Struct
โดยโทร new
&ส่งต่อรายการสัญลักษณ์ที่จะกลายเป็นตัวแปรอินสแตนซ์ของคลาสนี้
พวกเขาจะมีวิธีการเข้าถึงที่กำหนดไว้โดยค่าเริ่มต้น ทั้งสำหรับการอ่านและการเขียน
นี่คือตัวอย่าง :
Person = Struct.new(:name, :age, :gender)
ตอนนี้คุณสามารถสร้างวัตถุเช่นนี้ได้ :
john = Person.new "john", 30, "M" david = Person.new "david", 25, "M"
ทางเลือกอื่น
คุณอาจพบวิธีอื่นในการสร้างโครงสร้างในป่า
หน้าตาเป็นแบบนี้ :
class Person < Struct.new(:name, :age, :gender) end
ฉันไม่แนะนำสิ่งนี้
แต่ถ้าคุณค้นพบมันในตอนนี้ คุณจะรู้ว่ามันทำอะไร
ประโยชน์มหาศาล
ข้อดีของ struct ก็คือถ้าคุณสามารถเปรียบเทียบได้โดยตรงโดยอิงตามแอตทริบิวต์
ตัวอย่าง :
john == john # true
หากเป็นวัตถุ Ruby ปกติ คุณจะต้องกำหนด ==
วิธีการด้วยตัวคุณเอง
นี่คือสิ่งที่เราเรียกว่า "วัตถุมูลค่า"
วิธีใช้โครงสร้างทับทิม
ประโยชน์หลักประการหนึ่งจากการใช้ struct เหนืออาร์เรย์หรือแฮช คือ คุณสามารถเข้าถึงสมาชิกของ struct ได้โดยใช้เมธอด
ตัวอย่างเช่น :
puts john.age # 30 puts david.gender # "M"
สิ่งนี้มีประโยชน์เพราะถ้าคุณมีอาร์เรย์ของวัตถุ คุณสามารถใช้เมธอดเช่น max
, select
, sum
, ฯลฯ
ตัวอย่าง :
[john, david].max_by(&:age)
เยี่ยมเลย!
คำเตือน:โครงสร้างอาจเป็นเรื่องยุ่งยาก
ข้อแม้อื่นที่มีคลาสที่สร้างโครงสร้างคือ...
พวกเขาจะไม่บังคับใช้ จำนวนอาร์กิวเมนต์ที่ถูกต้องสำหรับตัวสร้าง!
ให้ฉันอธิบาย
ด้วยคลาสที่เหมาะสม คุณจะเห็นข้อผิดพลาดนี้:
ArgumentError: wrong number of arguments (0 for 3)
แต่ถ้าคุณใช้ Struct
อาร์กิวเมนต์ที่ขาดหายไปจะเป็นศูนย์:
Person.new("peter") # struct Person name="peter", age=nil, gender=nil
โปรดคำนึงถึงสิ่งนี้เมื่อทำงานกับ Struct
วัตถุ!
เรื่องแปลกๆอีกแล้ว
ลองดูที่นี้...
Struct.new(:a).ancestors [#<Class:0x29b1040>, Struct, Enumerable, Object, Kernel, BasicObject]
#<Class:0x29b1040>
นี้ เป็นคลาสที่ไม่ระบุชื่อที่เพิ่มไปยัง struct และให้สังเกตโมดูลที่นับได้ ซึ่งอนุญาตให้คุณเรียกใช้เมธอดเหมือนแต่ละ &map ได้
ตั้งชื่อพารามิเตอร์ใน Ruby 2.5
สมมติว่าคุณกำลังอ่านบรรทัดจากไฟล์ &แต่ละบรรทัดแสดงถึงหนึ่งรายการ
ตัวอย่าง :
200 /login 18:00 404 /bacon 18:03 200 /books 18:04
คุณทำงานกับข้อมูลนี้ได้ง่ายขึ้นหากคุณสร้างชั้นเรียนที่กำหนดเอง
ถูกใจสิ่งนี้ :
LogEntry = Struct.new(:status, :url, :time) LogEntry.new(200, '/books', '18:04')
แต่เพื่อให้ชัดเจนยิ่งขึ้นว่าทุกอาร์กิวเมนต์แสดงถึงอะไร คุณอาจต้องการใช้อาร์กิวเมนต์ของคีย์เวิร์ด
ข่าวดี!
Ruby 2.5 เพิ่มการรองรับอาร์กิวเมนต์คีย์เวิร์ดใน Struct
วัตถุ
วิธีใช้งาน :
LogEntry = Struct.new(:status, :url, :time, keyword_init: true) LogEntry.new(status: 200, url: '/books', time: '18:04')
ตอนนี้คุณสามารถแยกวิเคราะห์ไฟล์ของคุณและแปลงเป็น LogEntry
วัตถุ!
วิธีใช้ OpenStruct
หากคุณต้องการวัตถุแบบใช้ครั้งเดียว คุณควรพิจารณาใช้ OpenStruct
แทน
ตัวอย่างโค้ด :
require 'ostruct' cat = OpenStruct.new(color: 'black') puts cat.class puts cat.color
สังเกตว่าคุณต้องมี ostruct
. อย่างไร เพื่อเข้าคลาสนี้
คำเตือน:OpenStruct ช้าและคุณไม่ควรใช้กับแอปที่ใช้งานจริงตาม schneem ในความคิดเห็น reddit นี้ นอกจากนี้ ฉันยังพบโพสต์บล็อกนี้ที่มีเกณฑ์มาตรฐานรองรับสิ่งนี้
โครงสร้างกับ OpenStruct
ความแตกต่างระหว่าง Struct
&OpenStruct
:
- Sstruct สร้าง คลาสใหม่ ด้วยแอตทริบิวต์ที่กำหนดไว้ล่วงหน้า วิธีความเท่าเทียมกัน (==) &นับได้
- OpenStruct สร้าง วัตถุใหม่ ด้วยคุณสมบัติที่กำหนด
OpenStruct
เป็นวัตถุแฮชแฟนซี ในขณะที่ Struct
ก็เหมือนการสร้างคลาสใหม่จากเทมเพลต
ชมวิดีโอการสอน
บทสรุป
คุณได้เรียนรู้เกี่ยวกับ Ruby Struct &OpenStruct แล้ว! ตราบใดที่คุณทราบถึงลักษณะพิเศษของแต่ละคลาสเหล่านี้ คุณก็จะไม่มีปัญหา
ตอนนี้ถึงตาคุณฝึกฝนแล้ว 🙂