Struct trong Ruby là gì?
Cấu trúc là một lớp Ruby được tích hợp sẵn, nó được sử dụng để tạo các lớp mới tạo ra các đối tượng giá trị. Một đối tượng giá trị được sử dụng để lưu trữ các thuộc tính có liên quan với nhau.
Đây là một ví dụ :
Một Point
với hai tọa độ (x
&y
).
Bạn có thể trình bày dữ liệu này theo nhiều cách khác nhau.
Thích :
- Một mảng
[10, 20]
- Hàm băm
{ x: 10, y: 10 }
- Một đối tượng
Point.new(10, 20)
Nếu bạn sẽ có nhiều hơn một Point
, thường là một phương pháp hay để sử dụng phương pháp tiếp cận đối tượng.
Nhưng…
Bạn không muốn tạo toàn bộ lớp chỉ để lưu trữ hai giá trị này cùng nhau!
Sử dụng Struct
giải quyết vấn đề này.
Nội dung
- 1 Cách tạo cấu trúc trong Ruby
- 1.1 Cách thay thế
- 1.2 Lợi ích lớn
- 2 Cách sử dụng Ruby Structs
- 3 CẢNH BÁO:Các cấu trúc có thể phức tạp
- 3.1 Một điều kỳ lạ khác
- 4 Tham số được đặt tên trong Ruby 2.5
- 5 Cách sử dụng OpenStruct
- 6 Struct so với OpenStruct
- 7 Xem hướng dẫn bằng video
- 8 Kết luận
- 8.1 Có liên quan
Hãy làm điều này!
Cách tạo cấu trúc trong Ruby
Bạn có thể tạo một Struct
bằng cách gọi new
&chuyển vào danh sách các ký hiệu sẽ trở thành các biến phiên bản của lớp này.
Chúng sẽ có các phương thức truy cập được xác định theo mặc định, cả để đọc và ghi.
Đây là một ví dụ :
Person = Struct.new(:name, :age, :gender)
Bây giờ bạn có thể tạo một đố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 này để tạo cấu trúc trong tự nhiên.
Có vẻ như thế này :
class Person < Struct.new(:name, :age, :gender) end
Tôi không khuyên bạn nên làm điều này.
Nhưng nếu bạn tìm thấy nó ở đó bây giờ bạn biết nó có tác dụng gì.
Lợi ích lớn
Một điều tốt về cấu trúc nếu bạn có thể so sánh chúng trực tiếp, dựa trên các thuộc tính của chúng.
Ví dụ :
john == john # true
Nếu đây là một đối tượng Ruby thông thường, bạn sẽ phải xác định ==
tự phương pháp.
Đây là những gì chúng tôi gọi là "đối tượng giá trị".
Cách sử dụng Ruby Structs
Một trong những lợi ích chính khi sử dụng cấu trúc trên một mảng hoặc hàm băm là bạn có thể truy cập các thành viên cấu trúc bằng cách sử dụng các phương thức.
Ví dụ :
puts john.age # 30 puts david.gender # "M"
Điều này rất hữu ích vì nếu bạn có một mảng đối tượng, bạn có thể sử dụng các phương thức như max
, select
, sum
, v.v.
Ví dụ :
[john, david].max_by(&:age)
Tốt!
CẢNH BÁO:Các cấu trúc có thể khó hiểu
Một lưu ý khác với các lớp được tạo cấu trúc là ...
Chúng sẽ không thực thi số lượng đối số chính xác cho hàm tạo!
Hãy để tôi giải thích.
Với một 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 đang sử dụng Struct
các đối số bị thiếu sẽ bằng không:
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 Struct
đối tượng!
Một điều kỳ lạ khác
Hãy xem cái này ...
Struct.new(:a).ancestors [#<Class:0x29b1040>, Struct, Enumerable, Object, Kernel, BasicObject]
#<Class:0x29b1040>
này là một lớp ẩn danh được thêm vào cấu trúc, cũng lưu ý mô-đun có thể liệt kê, cho phép bạn gọi các phương thức như từng &map.
Các tham số được đặt tên trong Ruby 2.5
Giả sử rằng bạn đang đọc các dòng từ mộ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 bạn tạo một 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õ hơn mọi đối số đại diện cho điều gì, bạn có thể muốn sử dụng đối số từ khóa.
Tin tốt!
Ruby 2.5 đã thêm hỗ trợ cho các đối số từ khóa trong Struct
đối tượng.
Đây là cách sử dụng nó :
LogEntry = Struct.new(:status, :url, :time, keyword_init: true) LogEntry.new(status: 200, url: '/books', time: '18:04')
Giờ đây, bạn có thể phân tích cú pháp tệp của mình và chuyển đổi nó thành LogEntry
đối tượng!
Cách sử dụng OpenStruct
Nếu bạn chỉ cần một đối tượng duy nhất, thì bạn nên cân nhắc sử dụng OpenStruct
thay vào đó.
Ví dụ về mã :
require 'ostruct' cat = OpenStruct.new(color: 'black') puts cat.class puts cat.color
Lưu ý cách bạn phải yêu cầu ostruct
để có quyền truy cập vào lớp học này.
Cảnh báo:OpenStruct chậm và bạn không nên sử dụng nó trên các ứng dụng sản xuất, theo schneems trên bình luận reddit này. Ngoài ra, tôi thấy bài đăng trên blog này có một số điểm chuẩn hỗ trợ điều này.
Struct so với OpenStruct
Sự khác biệt giữa Struct
&OpenStruct
:
- Struct tạo một lớp mới với các thuộc tính được xác định trước, phương thức bình đẳng (==) và có thể liệt kê
- OpenStruct tạo một đối tượng mới với các thuộc tính đã cho
Một OpenStruct
là một đối tượng Hash ưa thích, trong khi Struct
giống như tạo một lớp mới từ một mẫu.
Xem hướng dẫn bằng video
Kết luận
Bạn đã học về Ruby Struct &OpenStruct! Miễn là bạn nhận thức được các đặc điểm đặc biệt của từng lớp này, bạn sẽ ổn.
Bây giờ đến lượt bạn luyện tập 🙂