Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Làm chủ Struct & OpenStruct trong Ruby: Đối tượng Giá trị Hiệu quả

Struct trong Ruby là gì?

Struct là lớp tích hợp sẵn của Ruby, nó được dùng để tạo lớp mới tạo ra đối tượng giá trị. Đối tượng giá trị dùng để lưu trữ các thuộc tính liên quan cùng nhau.

Đây là ví dụ:

Một Point với hai tọa độ (x và y).

Bạn có thể biểu diễn dữ liệu này theo nhiều cách khác nhau.

Như:

  • Mảng [10, 20]
  • Hash { x: 10, y: 10 }
  • Đối tượng Point.new(10, 20)

Nếu bạn sẽ có nhiều Point, thường là thực hành tốt dùng cách đối tượng.

Nhưng...

Bạn không muốn tạo toàn bộ một lớp chỉ để lưu hai giá trị này cùng nhau!

Dùng Struct giải quyết vấn đề này.

Nội dung

  • 1 Cách Tạo Struct trong Ruby
    • 1.1 Cách Thay thế
    • 1.2 Lợi ích Lớn
  • 2 Cách Dùng Ruby Struct
  • 3 CẢNH BÁO: Struct Có Thể Thú Vị
    • 3.1 Điều Kỳ Lạ Khác
  • 4 Tham số Đặt tên trong Ruby 2.5
  • 5 Cách Dùng OpenStruct
  • 6 Struct vs OpenStruct
  • 7 Xem Video Hướng dẫn
  • 8 Kết luận
    • 8.1 Liên quan

Chúng ta bắt đầu nào!

Cách Tạo Struct trong Ruby

Bạn có thể tạo Struct bằng cách gọi new và truyền vào danh sách symbol sẽ thành biến instance của lớp này.

Chúng sẽ có phương thức truy cập được định nghĩa mặc định, cả đọc và ghi.

Đây là ví dụ:

Person = Struct.new(:name, :age, :gender)

Bây giờ bạn có thể tạo đối tượng như thế này:

john = Person.new "john", 30, "M" david = Person.new "david", 25, "M"

Cách Thay thế

Bạn có thể tìm thấy cách khác tạo struct trong tự nhiên.

Nó trông như thế này:

class Person < Struct.new(:name, :age, :gender) end

Tôi không khuyến khích cách này.

Nhưng nếu bạn thấy nó ở đâu đó bây giờ bạn biết nó làm gì.

Lợi ích Lớn

Một điều tốt về structs là bạn có thể so sánh chúng trực tiếp, dựa trên thuộc tính của chúng.

Ví dụ:

john == john # true

Nếu đây là đối tượng Ruby thông thường, bạn phải tự định nghĩa phương thức ==.

Đây là điều chúng ta gọi là "đối tượng giá trị".

Cách Dùng Ruby Struct

Một trong những lợi ích chính dùng struct thay vì mảng, hay hash, là bạn truy cập thành viên struct dùng phương thức.

Ví dụ:

puts john.age # 30 puts david.gender # "M"

Điều này hữu ích vì nếu bạn có mảng đối tượng, bạn có thể dùng phương thức như max, select, sum, v.v.

Ví dụ:

[john, david].max_by(&:age)

Tuyệt!

CẢNH BÁO: Struct Có Thể Thú Vị

Một điều cần lưu ý với lớp do struct tạo ra là...

Chúng sẽ KHÔNG bắt buộc số lượng đối số đúng cho constructor!

Để tôi giải thích.

Với lớp thích hợp, bạn sẽ thấy lỗi này:

ArgumentError: wrong number of arguments (0 for 3)

Nhưng nếu bạn dùng Struct, đối số thiếu sẽ là nil:

Person.new("peter") # struct Person name="peter", age=nil, gender=nil

Hãy ghi nhớ điều này khi làm việc với đối tượng Struct!

Điều Kỳ Lạ Khác

Hãy nhìn vào điều này...

Struct.new(:a).ancestors [#<Class:0x29b1040>, Struct, Enumerable, Object, Kernel, BasicObject]

Đây #<Class:0x29b1040> là lớp vô danh được thêm vào structs, cũng lưu ý module enumerable, cho phép gọi phương thức như each và map.

Tham số Đặt tên trong Ruby 2.5

Giả sử bạn đang đọc dòng từ tệp và mỗi dòng đại diện cho một mục.

Ví dụ:

200 /login 18:00 404 /bacon 18:03 200 /books 18:04

Bạn làm việc dễ dàng hơn với dữ liệu này nếu tạo lớp tùy chỉnh.

Như thế này:

LogEntry = Struct.new(:status, :url, :time) LogEntry.new(200, '/books', '18:04')

Nhưng để làm rõ thêm mỗi đối số đại diện gì, bạn có thể muốn dùng tham số từ khóa.

Tin tốt!

Ruby 2.5 thêm hỗ trợ tham số từ khóa trong đối tượng Struct.

Cách dùng:

LogEntry = Struct.new(:status, :url, :time, keyword_init: true) LogEntry.new(status: 200, url: '/books', time: '18:04')

Bây giờ bạn có thể phân tích tệp và chuyển đổi thành đối tượng LogEntry!

Cách Dùng OpenStruct

Nếu bạn chỉ cần đối tượng một lần, bạn nên cân nhắc dùng OpenStruct thay thế.

Ví dụ mã:

require 'ostruct' cat = OpenStruct.new(color: 'black') puts cat.class puts cat.color

Lưu ý bạn phải require ostruct để truy cập lớp này.

Cảnh báo: OpenStruct chậm và bạn không nên dùng trong ứng dụng production, theo bình luận reddit của schneems. Cũng tìm thấy bài viết blog có benchmark hỗ trợ điều này.

Struct vs OpenStruct

Sự khác biệt giữa Struct và OpenStruct:

  • Struct tạo lớp mới với thuộc tính định nghĩa trước, phương thức so sánh (==) và enumerable
  • OpenStruct tạo đối tượng mới với thuộc tính cho trước

Một OpenStruct là đối tượng Hash phức tạp, trong khi Struct giống như tạo lớp mới từ mẫu.

Xem Video Hướng dẫn

Kết luận

Bạn đã học về Ruby Struct và OpenStruct! Miễn là bạn nhận ra đặc điểm đặc biệt của từng lớp, bạn sẽ ổn.

Làm chủ Struct & OpenStruct trong Ruby: Đối tượng Giá trị Hiệu quả

Bây giờ đến lượt bạn thực hành 🙂