Singleton Classes Aren't round-trippable
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 35/100
Hướng nghiên cứu
Tái hiện ví dụ Singleton bằng YAML.unsafe_load, sau đó đọc psych/visitors/to_ruby.rb xung quanh revive và lệnh gọi klass.allocate được báo cáo. So sánh hành vi với cách Singleton xử lý Marshal và xác định việc tùy chỉnh cấp phát nên hoạt động như thế nào. Hoàn tất khi các instance của Singleton round-trip mà không tuần tự hóa các biến instance và quá trình giải tuần tự hóa sử dụng lại instance hiện có.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
require "psych"
require "singleton"
class A
include Singleton
end
YAML.unsafe_load(A.instance.to_yaml
result:
/Users/cody/.gem/ruby/3.1.3/gems/psych-5.1.1/lib/psych/visitors/to_ruby.rb:408:in `revive': private method `allocate' called for A:Class (NoMethodError)
s = register(node, klass.allocate)
^^^^^^^^^
from /Users/cody/.gem/ruby/3.1.3/gems/psych-5.1.1/lib/psych/visitors/to_ruby.rb:215:in `visit_Psych_Nodes_Mapping'
from /Users/cody/.gem/ruby/3.1.3/gems/psych-5.1.1/lib/psych/visitors/visitor.rb:30:in `visit'
from /Users/cody/.gem/ruby/3.1.3/gems/psych-5.1.1/lib/psych/visitors/visitor.rb:6:in `accept'
from /Users/cody/.gem/ruby/3.1.3/gems/psych-5.1.1/lib/psych/visitors/to_ruby.rb:35:in `accept'
from /Users/cody/.gem/ruby/3.1.3/gems/psych-5.1.1/lib/psych/visitors/to_ruby.rb:320:in `visit_Psych_Nodes_Document'
from /Users/cody/.gem/ruby/3.1.3/gems/psych-5.1.1/lib/psych/visitors/visitor.rb:30:in `visit'
from /Users/cody/.gem/ruby/3.1.3/gems/psych-5.1.1/lib/psych/visitors/visitor.rb:6:in `accept'
from /Users/cody/.gem/ruby/3.1.3/gems/psych-5.1.1/lib/psych/visitors/to_ruby.rb:35:in `accept'
from /Users/cody/.gem/ruby/3.1.3/gems/psych-5.1.1/lib/psych/nodes/node.rb:50:in `to_ruby'
from /Users/cody/.gem/ruby/3.1.3/gems/psych-5.1.1/lib/psych.rb:274:in `unsafe_load'
I would expect a Singleton class to both a) not actually serialize any instance variables, and b) upon deserialization, just use the existing instance. Singleton does this when using Marshal, but Marshal is part of Ruby core. And Psych does not provide any way for a class to control allocation when coming from YAML the way that Marshal can, so even if the argument is that Singleton should control its own destiny (by implementing encode_with), Psych needs to provide a way to customize object allocation (without having to override allocate, which might make things complicated for allocating objects "normally").
- Ngôn ngữ chính
- Ruby
- Star
- 597
- Fork
- 223
- Merge trung bình
- 6 giờ 8 phút
- Pull request đã merge (30 ngày)
- 2
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của ruby/psych
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
-
Documentation
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 72/100
-
Psych.dump raises Encoding::CompatibilityError for UTF-16/UTF-32 stringsCó thể đã có người làm @Halvanhelv đã nhận 27 ngày trước. Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 55/100
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 68/100
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 52/100
Issue tương tự
-
chore
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 78/100
AllYourBot/hostedgpt#818 · 4 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
[bug]: Sticky Streak DisappearedĐang mởbug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Použiť Redis pre ActionCableĐang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
slovensko-digital/autogram-portal#392 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
voxpupuli/puppet-quadlets#122 · 5 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 82/100
TheOdinProject/curriculum#31452 ·
Maintainer thường phản hồi trong vòng 1 ngày