Có một lý do hợp lệ để không có phương thức trả về dữ liệu của cấu trúc chuẩn ruby dưới dạng băm (thành viên, cặp giá trị) không? Thấy rằng cấu trúc và băm có trường hợp sử dụng rất giống nhau, tôi ngạc nhiên rằng không có phương pháp như vậy tồn tại. Hay là thế, và tôi quá mù? Thật dễ dàng để thực hiện (và tôi đã làm như vậy bây giờ), nhưng thiếu chức năng như vậy trong libs tiêu chuẩn, có tôi nghĩ rằng tôi có thể đã không thực sự nắm bắt được khái niệm về cấu trúc trong ruby.trả về dữ liệu cấu trúc dưới dạng băm trong ruby
Trả lời
(của Ruby < = 1.9.3) OpenStruct
có OpenStruct#marshall_dump và Struct
có Struct#each_pair (sử dụng to_a
để nhận các cặp và Hash
+ to_a
để nhận hàm băm):
Person = Struct.new(:name, :age)
person = Person.new("Jamie", 23)
person_hash = Hash[person.each_pair.to_a]
#=> {:age=>23, :name=>"Jamie"}
Với Ruby điều 2.0 là dễ dàng hơn: Struct#to_h, OpenStruct#to_h:
Person = Struct.new(:name, :age)
person = Person.new("Jamie", 23)
person_hash = person.to_h
#=> {:age=>23, :name=>"Jamie"}
Tôi không nghĩ rằng các trường hợp sử dụng cho băm và cấu trúc rất giống nhau. Một băm cho phép bạn lưu trữ một số lượng các cặp khóa-giá trị thay đổi và phù hợp để lưu trữ hàng nghìn cặp nếu bạn muốn. Không có khóa cụ thể nào được đảm bảo có mặt. Với Struct, bạn luôn biết bộ "phím" sẽ là gì và nó thường nhỏ (dưới 20).
Có thể sử dụng dấu gạch ngang để liên kết một số thông tin với một số lượng lớn các đối tượng khác nhau. Các dấu gạch ngang được sử dụng để chỉ định tham số tùy chọn cho hàm. Structs có thể được sử dụng khi bạn muốn giữ một số thông tin được xác định rõ ràng với nhau trong một đối tượng.
Tôi chưa bao giờ muốn chuyển đổi từ cấu trúc thành băm nên tôi tự hỏi tại sao bạn làm như vậy.
CHỈNH SỬA 1: Bạn có biết bạn có thể sử dụng cú pháp không bẻ khóa này với Structs không?
P = Struct.new(:x,:y)
p = P.new(1,2)
p.x # => x
EDIT 2: Hashes cũng có thể được sử dụng để tìm kiếm đối tượng một cách nhanh chóng. obj_hashed_by_name[name]
có thể nhanh hơn nhiều so với obj_array.find { |a| a.name == name }
.
tôi vẫn thấy không có lý do không thể truy xuất các cặp thành viên, giá trị dưới dạng băm. đặc biệt là xem xét một cấu trúc không có vấn đề gì với hành động như một mảng, mà tôi tìm thấy gọn gàng ở lần, nhưng nhận được ở các giá trị của một cấu trúc mà không có bối cảnh (các thành viên) chủ yếu có vẻ khá vô dụng với tôi. – cvshepherd
Tôi đoán Tôi không biết lý do tại sao bạn muốn làm điều đó một trong hai, nhưng:
s.members.inject({}) { |m, f| m[f] = s[f]; m }
Hoặc, sử dụng each_with_object
:
s.members.each_with_object({}) { |m, h| h[m] = s[m] }
lý do tôi cần/muốn điều này, là để có thể sắp xếp theo giá trị, mà một hash hiện khá độc đáo. – cvshepherd
@cvshepherd Ah.Tôi đoán tôi đã sử dụng một lớp rồi, nhưng bây giờ tôi đã nhận được nó :) –
Câu trả lời được chấp nhận không làm việc cho tôi, tôi sử dụng sau đây thay vì
require 'ostruct'
require 'date'
lid = OpenStruct.new(:status=>0,:rowversion=>0,:cre_dt=>DateTime.now.to_date,:cre_user=>'9999999')
p Hash[lid.each_pair.to_a] #=> {}
p lid.marshal_dump #=>{:status=>0, :rowversion=>0, :cre_dt=>#<Date: 2014-03-03 ((2456720j,0s,0n),+0s,2299161j)>, :cre_user=>"9999999"}
- 1. Cấu trúc dữ liệu dạng băm động ở Fortran
- 2. SQL 2008: trả về hàng dữ liệu dưới dạng JSON?
- 3. Cấu trúc dữ liệu cây và đồ thị trong ruby
- 4. Giải thích về mã Ruby để xây dựng Trie cấu trúc dữ liệu
- 5. Dữ liệu thực nghiệm về tái cấu trúc?
- 6. Cấu trúc và cấu trúc dữ liệu khác nhau
- 7. Thư viện cấu trúc dữ liệu C
- 8. Cấu trúc dữ liệu phức tạp Redis
- 9. Mẫu cấu trúc dữ liệu RESTful
- 10. Cấu trúc dữ liệu C#
- 11. Cấu trúc trả về từ hàm (C)
- 12. Một câu đố về cấu trúc dữ liệu
- 13. Tạo cấu trúc dữ liệu như cấu trúc dữ liệu trong Java
- 14. $ .jquery ajax dữ liệu trả về (json) hiển thị dưới dạng 'không xác định'
- 15. Java câu hỏi cấu trúc dữ liệu
- 16. Trả về sha1() băm từ couchdb
- 17. Cấu trúc dữ liệu trong Python
- 18. Loại dữ liệu cấu trúc trong Mathematica?
- 19. chuyển cấu trúc dữ liệu từ java sang perl
- 20. Tài liệu tốt về cấu trúc tcp_info
- 21. Cấu trúc trả về mã lỗi REST API
- 22. Chuyển đổi cấu trúc dữ liệu MIDI sang Java (Danh sách, Bản đồ băm, ???)
- 23. Tái cấu trúc trong Ruby
- 24. Làm cách nào để tôi sắp xếp cấu trúc dưới dạng con trỏ tới cấu trúc?
- 25. Cấu trúc dữ liệu Trie - Java
- 26. Tôi làm cách nào để tạo mã băm cho cấu trúc dữ liệu tùy chỉnh?
- 27. Java: cấu trúc băm liên tục lớn?
- 28. Chuyển cấu trúc dưới dạng id có thể?
- 29. Truy cập cấu trúc dữ liệu Scala trong JRuby
- 30. trả về bảng SQL dưới dạng JSON trong python
Cảm ơn vì giải pháp 'tiêm chích' này, và quan trọng hơn đối với người Informatian là OpenStruct có một phương pháp như vậy, ở một mức độ, trả lời câu hỏi của tôi đây là một điều khả thi để hỏi về một ruby Struct (rõ ràng là nó). – cvshepherd
Trong Ruby 2.0 có một phương thức to_h trong Struct. –