2011-11-06 4 views
6

NilClass, TrueClassFalseClass 즉, 각 상수 nil, truefalse를 하나 개의 인스턴스를 가지고 무엇 NilClass, TrueClass의 목적이며, FalseClass? 왜 그들은 Object 클래스의 인스턴스가 될 수 없으며 모든 관련 메서드는 nil, truefalse에 대한 싱글 톤 메서드로 간단히 정의 할 수 있습니까? 이와 관련된 질문은 왜 이것들을 상수로 정의하지 않는 것입니까?이러한 클래스를 갖는 목적은 무엇인가,

+1

좋은 질문입니다. 파이썬에서도 마찬가지입니다. 따라서 그 뒤에 충분한 이유가 있어야합니다. –

+0

루비의 상수는 실제로 일정하지 않습니다. http://www.rubyist.net/~slagell/ruby/constants.html – house9

+0

질문이 있습니다. * 이러한 값 각각에 대해 별도의 클래스를 사용하지 않는 * 이점은 무엇입니까? 싱글 톤 방법을 사용하는 것은 거의 간단한 해결책이 아니며 불필요한 복잡성 IMO를 추가합니다. – diedthreetimes

답변

11

"모든 것이 개체"이고 "개체는 인스턴스의 클래스에 의해 특수화됩니다"라는 생각을 계속 유지합니다.

nil, truefalse 모든 객체 (및 방법과 클래스의 인스턴스화이다). 그들이 부과하는 것은 1) 각각의 유형의 유일한 거주자이며 2) 불변 객체 은 구현 최적화를 허용합니다. - 실제로는 하나가 아닙니다.nil이 충분합니까?

값을 지정하지 않고 유용한 오류 메시지 : x.class "그냥 작동합니다".

> > nil.foo 
> => #<NoMethodError: undefined method `foo' for nil:NilClass> 

내가 말했다 기쁘다 NilClass :-)

이 클래스 인스턴스 접근 방식은 또한 재 개방 NilClass한다 - 그것은을 위해 할 수있는 방법을 쉽게하고 일관된 등 -에 대한 좋든 나쁘 다른 유형.

적어도 루비를 1.9.2의로 재 지정 true, false 또는 nil 할 수 없습니다 (참/거짓의 파이썬 2.x에서 허용 된 재 할당,하지만 파이썬 3.x의에서 않습니다). true/false/nil이 아니기 때문에 상수이기 때문에 상수 룩업없이 "리터럴 값"으로 AST 또는 구현에서 사용하는 모든 것으로 최적화 할 수 있습니다.

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

해피 코딩.

+0

물론 이것들은 객체이기 때문에 어떤 클래스에 속해야합니다. 왜 그들이'Object' 클래스의 인스턴스가 될 수 없는지 묻고 있습니다. 나는 상수에 관한 대답의 두 번째 부분을 얻는다. 그 점 때문에 저를 지워줍니다. – sawa

1

루비의 접근 방식을 취하고 "단지 객체를 가지고 여기에 몇 가지 싱글 방법을 추가"시간의 일부 : 개인 : 공공, :

C:\Documents and Settings\a.grimm>irb 
irb(main):001:0> self.methods - Object.new.methods 

[제공 포함 : 문맥 : conf의 : irb_quit : 출구, 는 : 종료 : 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, : 작업 영역, : irb_bindings, : 바인딩, : irb_pushws, : pushws, : irb_pushb, : irb_pushb, : pushb, : irb_popws, : popws, : irb_pop_binding, : irb_popb, : popb , : 소스 : 작업 : FG : 죽 : 도움 : 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 : 그들은 true, false 또는 0이 접근하지 않는 이유 irb_help]

나도 몰라. 어쩌면 사람들은 (pst의 대답에 따라) 이러한 객체를 이해해야하는 반면, 사람들은 "메인"(?) 객체를 이해할 필요가 없기 때문일 수 있습니다.

+0

주요 개체는 나에게 특별한 경우처럼 보입니다. 대부분의 프로그램은 한번도 참조하지 않습니다. – diedthreetimes

관련 문제