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

วิธีใช้ Struct &OpenStruct ใน Ruby

โครงสร้างในทับทิมคืออะไร

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 แล้ว! ตราบใดที่คุณทราบถึงลักษณะพิเศษของแต่ละคลาสเหล่านี้ คุณก็จะไม่มีปัญหา

วิธีใช้ Struct &OpenStruct ใน Ruby

ตอนนี้ถึงตาคุณฝึกฝนแล้ว 🙂