2011-08-07 3 views
8

MRI implementation of gc.c에서 undef이라는 개체를 보았습니다. 그게 undef 개체입니까? 그 수업은 무엇입니까? 어떻게 접근 할 수 있습니까? 그것을위한 유틸리티가 있습니까?Ruby의 "undef"객체는 무엇입니까?

+2

나는 그것이 무엇인지 모르지만, 아마 메서드를 정의 해제하는 데 사용되는'undef' 메서드와 관련이 없습니다. –

+1

@Andrew Grimm 예, 동의합니다! –

답변

5

내 생각에 교양있는 추측입니다. Matz이이 질문을 언젠가는 보게 될 것이고 확실한 답을 주셨을 것입니다.

알다시피, 루비는 적어도 초기에는 펄의 영향을 많이 받았다. 그래서 우리는 $ @와 $ _ 같은 변수를 가지고있다. Perl은 키워드/기능이 undef입니다 (예 : 초기화하지 않고 변수를 선언하는 경우 해당 값은 정의되지 않음). 나는 루비가 과거에 비슷한 것을 (즉, 변수가 정의되지 않은 값을 가질 수 있어야 함) 의미하기도했다. 우리는 이것을 어떻게 알 수 있습니까? 발견 된 문맥에 따라.

이 주석은 다양한 Ruby 객체 중 object_id이 어떻게 파생되는지 설명합니다. 그 중 일부는 here입니다. 그러나, 본질적으로 우리는 다음을 알고

false.object_id == 0 
true.object_id == 2 
nil.object_id == 4 

이 댓글이 제안이 실제로 사건이 무엇인지, 당신이 열려 irb 세션을 해독하고 자신을 위해 그것을 밖으로 시도 할 수있다. 우리가 아는 한 - - undefobject_id 이제 6

의이 의미 것처럼 그것은, undef 실제로 루비에서 예약어이지만 nil, falsetrue처럼, 그것이 특별한 대상이 아닌 보이는 메소드를 정의 해제하는 데 사용되는 키워드.

질문에 대답하려면 undef 개체가 없으며 클래스가 없으므로 액세스 할 수 없습니다. undef이 제공하려는 목적은 대신 우리가 오늘 알고있는 루비의 nil 객체에 의해 제공됩니다. 그러나 우리가 궁금해하고 궁금해하는 것들을 찾기 위해 지나간 유산의 유산으로 규정되어 있습니다.

+0

'ObjectSpace._id2ref (6)'로 검색 할 수 없기 때문에 객체가 아니라는 것을 알았습니다. [여러 곳] (http://rxr.whitequark.org/mri/ident?i=Qundef), [여기] (http://rxr.whitequark.org/mri/source/include/ruby/)에 있습니다. ruby.h # 352) 그것은 "placeholder에 대해 정의되지 않은 값"으로 언급됩니다.사실 0, -1, NULL 등이 아닌 정의되지 않은 (또는 널) 값을 나타내는 데 사용됩니다. 유효한 Ruby 객체와의 충돌을 피하는 것이 필요합니다. 좋은 예는 [제거 된 인스턴스 변수를 무효화] (http://rxr.whitequark.org/mri/source/variable.c#1279)입니다. –

+0

+1에 대한 귀하의 링크는 +1입니다. 고맙습니다! :) –

+0

마지막 예제에서는 Qundef가 제거되는 인스턴스 변수의 값을 덮어 쓰는 데 사용되는 것처럼 보입니다. Ruby가 해당 인스턴스 변수에 액세스하려고하면 예외가 발생해야합니다. 그들이 단순히 Qnil을 사용한 경우 내 생각에 예외가 발생하지 않을 것입니다. 그러나 원하는 동작이 아닌 반환 값으로 되돌아 오지 않을 것입니다. 매우 흥미 롭습니다. 나는 이것에 대해 조사하는 것을 즐겼습니다. 좋은 질문입니다. – skorks

-2

저는 이것이 정의되지 않은 변수를 말하는 것이라고 확신합니다 (nil으로 정의 된 변수와 반대 됨).

이것 좀 봐 :

def hello(object = 'World') 
    puts "Hello #{object}" 
end 

hello     #=> 'Hello World' 
hello 'stackoverflow' #=> 'Hello stackoverflow' 
hello nil    #=> 'Hello ' 

편집 : 이 질문에 대한 더 완전한 답 결론을. 해당 undef 개체에 액세스 할 수 없습니다. 메서드 정의에만 있고 본문에는 존재하지 않습니다. 기본 값 (위의 'World'과 같이)으로 채워지거나 모든 메소드 매개 변수를 지정하지 않았기 때문에 ArgumentError이 표시됩니다.

+0

아, 나에게 당신의 대답을 이해하는 데 분이 걸렸습니다. 메소드에 인수를 전혀 전달하지 않고'nil'을 전달하는 것의 차이점이 있습니다. 그 차이점은'undef' 객체입니다. 그게 당신이 말하는거야? – mikezter

+0

문자 그대로 값을 전달하지 않으면 올바른 기본 인수 값이 우선합니다. – Koraktor