2011-11-06 15 views
6

NilClass, TrueClassFalseClass có một ví dụ mỗi, cụ thể là nil, truefalse, 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, truefalse? 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

+1

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ó. –

+0

Hằng số trong ruby ​​không thực sự ổn định, http://www.rubyist.net/~slagell/ruby/constants.html – house9

+0

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

Trả lời

11

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, truefalse 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/nilkhô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 {|tru­e|} 
> => #<SyntaxError: Can't change the value of true> 

Mã hóa hạnh phúc.

+0

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

1

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" (?).

+0

Đố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