NilClass
, TrueClass
và FalseClass
có một ví dụ mỗi, cụ thể là nil
, true
và false
, mà là hằng số, mục đích của việc tổ chức các lớp học là gì? Tại sao họ không thể là trường hợp của lớp Object
và tất cả các phương pháp có liên quan được định nghĩa đơn giản là phương thức singleton trên nil
, true
và false
? Một câu hỏi liên quan là, tại sao những điều này không được định nghĩa là hằng số?mục đích NilClass, TrueClass là gì, và FalseClass
Trả lời
Nó giữ với ý tưởng rằng "tất cả mọi thứ là một đối tượng" và "đối tượng được chuyên môn bởi các lớp họ là trường hợp".
nil
, true
và false
là tất cả các đối tượng (và do đó tức thời của lớp với phương pháp). Việc áp đặt rằng họ là 1) những cư dân duy nhất thuộc loại tương ứng và là 2) đối tượng bất biến cho phép tối ưu hóa triển khai - và thực sự, không phải là mộtnil
đủ?
Thông báo lỗi hữu ích mà không cần chuyên môn hóa cho các giá trị: x.class
"chỉ hoạt động".
> > nil.foo
> => #<NoMethodError: undefined method `foo' for nil:NilClass>
Tôi vui nó nói NilClass
:-)
cách tiếp cận lớp sơ thẩm này cũng làm cho tái mở NilClass
- cho tốt hơn hoặc tệ hơn - dễ dàng và phù hợp với nó như thế nào có thể được thực hiện cho các loại khác.
Ít nhất là của Ruby 1.9.2, không thể gán lại true
, false
hoặc nil
(Python 2.x được phép gán lại True/False, nhưng không bằng Python 3.x). Lưu ý rằng bởi vì true/false/nil
là không phải là hằng số chúng có thể được tối ưu hóa vào AST - hoặc bất kỳ việc triển khai nào sử dụng - dưới dạng "giá trị theo nghĩa đen" mà không cần tra cứu liên tục.
> > VERSION
> => "1.9.2"
> > true = false
> => #<SyntaxError: Can't change the value of true>
> > [].each {|true|}
> => #<SyntaxError: Can't change the value of true>
Mã hóa hạnh phúc.
Tất nhiên đây là những đối tượng và phải thuộc về một số lớp học. Tôi hỏi tại sao họ không thể là trường hợp của lớp 'Object'. Tôi nhận được phần thứ hai của câu trả lời liên quan. Điều đó xóa tôi với điểm đó. – sawa
của Ruby có cách tiếp cận của "chỉ mất một đối tượng và thêm một số phương pháp singleton để nó" một số thời gian:
C:\Documents and Settings\a.grimm>irb
irb(main):001:0> self.methods - Object.new.methods
cho
[: public, private,: include ,: bối cảnh,: conf,: irb_quit,: exit, : bỏ thuốc lá,: irb_print_working_workspace,: irb_cwws,: irb_pwws,: cwws, : pwws,: irb_current_working_binding,: irb_print_working_binding, : irb_cwb,: irb_pwb,: irb_chws,: irb_cws,: chws,: cws, : irb_change_binding,: irb_cb,: cb,: workspaces,: irb_bindings, : bindings,: irb_pushws,: pushws,: irb_push_binding,: irb_pushb, : pushb,: irb_popws,: popws,: irb_pop_binding,: irb_popb,: popb , : nguồn,: việc làm,: fg,: giết,: giúp đỡ,: irb_exit,: irb_context, : install_alias_method,: irb_current_working_workspace, : irb_change_workspace,: irb_workspaces,: irb_push_workspace, : irb_pop_workspace,: irb_load,: irb_require, : irb_source,: IRB, : irb_jobs,: irb_fg,: irb_kill,: irb_help]
tôi không biết tại sao họ không làm phương pháp này với true
, false
hoặc nil
. Có lẽ bởi vì mọi người cần phải hiểu những đối tượng này (theo câu trả lời của pst), trong khi mọi người không cần phải hiểu đối tượng "chính" (?).
Đối tượng chính có vẻ như là một trường hợp đặc biệt đối với tôi. Hầu hết các chương trình không bao giờ tham chiếu ngay cả khi tham chiếu nó một lần. – diedthreetimes
- 1. mục đích là gì? "::" trong
- 2. Mục đích của BFS và DFS là gì?
- 3. Mục đích của __str__ và __repr__ là gì?
- 4. Mục đích của HttpHeaders.TryAddWithoutValidation là gì?
- 5. Mục đích của tệp .edmx là gì?
- 6. Mục đích của lớp Expression là gì?
- 7. Mục đích của Rake là gì?
- 8. Mục đích của config.assets.precompile là gì?
- 9. Mục đích của phiên JMS là gì?
- 10. Mục đích của character_set_connection là gì?
- 11. Mục đích của Parse Vexing là gì?
- 12. Mục đích của UIWindow là gì?
- 13. Mục đích của tệp vshost.exe là gì?
- 14. Mục đích sử dụng là gì?
- 15. Factory Girl - mục đích là gì?
- 16. Mục đích của startManagingCursor là gì?
- 17. Mục đích của 'var' là gì?
- 18. Mục đích của is_uploaded_file() là gì?
- 19. Mục đích của __cxa_pure_virtual là gì?
- 20. Mục đích của thuộc tính-đích là gì?
- 21. JAF là gì? Mục đích của nó là gì?
- 22. Tệp xcscheme là gì? Mục đích của nó là gì?
- 23. Mục đích của nguyên mẫu là gì?
- 24. Mục đích của Array.GetLowerBound (int) là gì?
- 25. Mục đích của tệp pdb là gì?
- 26. Mục đích của String.IsInterned là gì?
- 27. Mục đích của ldexp là gì?
- 28. Mục đích của IntentSender là gì?
- 29. Mục đích của layout.xml là gì?
- 30. Mục đích của requestWindowFeature() là gì?
Câu hỏi hay, cũng giống như vậy trong Python, vì vậy phải có một số lý do chính đáng đằng sau nó. –
Hằng số trong ruby không thực sự ổn định, http://www.rubyist.net/~slagell/ruby/constants.html – house9
Câu hỏi dành cho bạn. Lợi ích của * NOT * có các lớp riêng biệt cho mỗi giá trị này là gì? Sử dụng phương pháp singleton hiếm khi là giải pháp đơn giản nhất và thêm IMO phức tạp không cần thiết. – diedthreetimes