2014-09-27 2 views
1

우리가 알듯이 (거의) 루비의 모든 것은 클래스의 인스턴스 인 객체입니다.
nil도 목적 :NilClass로부터 nil을 어떻게 인스턴스화 할 것인가?

2.1.3 :016 > nil.object_id 
=> 8 

그리고 그것은 NilClass의 인스턴스이다

2.1.3 :017 > nil.class 
=> NilClass 

그 목적은 new 방법을 사용하여 인스턴스화된다.

NilClass 검사, 나는 그것이 new 방법이없는 발견 : 더 new 방법이없는 경우 단지 호기심에서 지금

2.1.3 :021 > NilClass.methods.sort 
=> [:!, :!=, :!~, :<, :<=, :<=>, :==, :===, :=~, :>, :>=, :__id__, :__send__, :allocate, :ancestors, :autoload, :autoload?, :class, :class_eval, :class_exec, :class_variable_defined?, :class_variable_get, :class_variable_set, :class_variables, :clone, :const_defined?, :const_get, :const_missing, :const_set, :constants, :define_singleton_method, :display, :dup, :enum_for, :eql?, :equal?, :extend, :freeze, :frozen?, :hash, :include, :include?, :included_modules, :inspect, :instance_eval, :instance_exec, :instance_method, :instance_methods, :instance_of?, :instance_variable_defined?, :instance_variable_get, :instance_variable_set, :instance_variables, :is_a?, :kind_of?, :method, :method_defined?, :methods, :module_eval, :module_exec, :name, :nil?, :object_id, :prepend, :private_class_method, :private_constant, :private_instance_methods, :private_method_defined?, :private_methods, :protected_instance_methods, :protected_method_defined?, :protected_methods, :public_class_method, :public_constant, :public_instance_method, :public_instance_methods, :public_method, :public_method_defined?, :public_methods, :public_send, :remove_class_variable, :remove_instance_variable, :respond_to?, :send, :singleton_class, :singleton_class?, :singleton_method, :singleton_methods, :superclass, :taint, :tainted?, :tap, :to_enum, :to_s, :trust, :untaint, :untrust, :untrusted?] 

을의 NilClass에서 인스턴스화 nil 객체는 어떻게?

+0

1. '새 방법'일 필요는 없습니다. http://www.ruby-doc.org/stdlib-1.9.3/libdoc/singleton/rdoc/Singleton.html은'Klass # instance'를 사용합니다. 2.'nil'은 C/C++에서 하드 코딩 된 것 같습니다. (표준 Ruby ** 중 어떤 것이 사용되는지는 기억이 안납니다.) 3377 줄까지 https://github.com/ruby/ruby/blob/0ef94bd2afa035648032e382201f1c9af29c5c3a/object.c#L3360 읽기. 이것은 왜'new' (그리고'alloc')가 없는지를 설명합니다. 나는'rb_cNillClass'가 인스턴스화 된 어딘가에 있다고 생각합니다. 더 많이 알고 싶다면 github에서 찾을 수 있습니다 (github 검색 엔진을 사용하여 검색 할 때 나쁘다. 그래서 나는 뭔가를 놓친 것 같음) –

답변

2

아니고 :

NilClass

싱글 객체 전무의 클래스입니다.

http://www.ruby-doc.org/core-2.1.3/NilClass.html

이것은 명확하게됩니다 루비

irb(main):005:0> a = nil 
=> nil 
irb(main):006:0> b = nil 
=> nil 
irb(main):007:0> a.object_id 
=> 8 
irb(main):008:0> b.object_id 
=> 8 
+0

FalseClass와 TrueClass에 동일하게 적용됩니다. – max

+0

@brahmana 감사합니다! – max

+0

@brahmana & papirtiger이 코드는'nil'이 어떤 클래스의 객체라는 것을 증명합니다. 'a = nil'과'b = nil'은 동일한 객체를 할당하므로 객체 ID는 동일합니다. 이것을 확인하십시오 :'o = Object.new; a1 = 0; a2 = 0; a2.object_id == a1.object_id # true' –

1

일부 개체가 포함 인스턴스화되지 않습니다 숫자, 기호, 없음, 참 및 거짓. @ papirtiger의 코드를 사용하고 nil을 숫자 나 기호로 바꾸면 동일한 결과가 표시됩니다.

+0

나는 숫자 대신에'Fixnum'을 말할 것이다. 'Bignum이 인스턴스화됩니다. –

관련 문제