MRI implementation of gc.c에서 undef
이라는 개체를 보았습니다. 그게 undef
개체입니까? 그 수업은 무엇입니까? 어떻게 접근 할 수 있습니까? 그것을위한 유틸리티가 있습니까?Ruby의 "undef"객체는 무엇입니까?
답변
내 생각에 교양있는 추측입니다. Matz이이 질문을 언젠가는 보게 될 것이고 확실한 답을 주셨을 것입니다.
알다시피, 루비는 적어도 초기에는 펄의 영향을 많이 받았다. 그래서 우리는 $ @와 $ _ 같은 변수를 가지고있다. Perl은 키워드/기능이 undef
입니다 (예 : 초기화하지 않고 변수를 선언하는 경우 해당 값은 정의되지 않음). 나는 루비가 과거에 비슷한 것을 (즉, 변수가 정의되지 않은 값을 가질 수 있어야 함) 의미하기도했다. 우리는 이것을 어떻게 알 수 있습니까? 발견 된 문맥에 따라.
이 주석은 다양한 Ruby 객체 중 object_id
이 어떻게 파생되는지 설명합니다. 그 중 일부는 here입니다. 그러나, 본질적으로 우리는 다음을 알고
false.object_id == 0
true.object_id == 2
nil.object_id == 4
이 댓글이 제안이 실제로 사건이 무엇인지, 당신이 열려 irb
세션을 해독하고 자신을 위해 그것을 밖으로 시도 할 수있다. 우리가 아는 한 - - undef
는 object_id
이제 6
의이 의미 것처럼 그것은, undef
실제로 루비에서 예약어이지만 nil
, false
및 true
처럼, 그것이 특별한 대상이 아닌 보이는 메소드를 정의 해제하는 데 사용되는 키워드.
질문에 대답하려면 undef
개체가 없으며 클래스가 없으므로 액세스 할 수 없습니다. undef
이 제공하려는 목적은 대신 우리가 오늘 알고있는 루비의 nil
객체에 의해 제공됩니다. 그러나 우리가 궁금해하고 궁금해하는 것들을 찾기 위해 지나간 유산의 유산으로 규정되어 있습니다.
'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)입니다. –
+1에 대한 귀하의 링크는 +1입니다. 고맙습니다! :) –
마지막 예제에서는 Qundef가 제거되는 인스턴스 변수의 값을 덮어 쓰는 데 사용되는 것처럼 보입니다. Ruby가 해당 인스턴스 변수에 액세스하려고하면 예외가 발생해야합니다. 그들이 단순히 Qnil을 사용한 경우 내 생각에 예외가 발생하지 않을 것입니다. 그러나 원하는 동작이 아닌 반환 값으로 되돌아 오지 않을 것입니다. 매우 흥미 롭습니다. 나는 이것에 대해 조사하는 것을 즐겼습니다. 좋은 질문입니다. – skorks
저는 이것이 정의되지 않은 변수를 말하는 것이라고 확신합니다 (nil
으로 정의 된 변수와 반대 됨).
def hello(object = 'World')
puts "Hello #{object}"
end
hello #=> 'Hello World'
hello 'stackoverflow' #=> 'Hello stackoverflow'
hello nil #=> 'Hello '
편집 : 이 질문에 대한 더 완전한 답 결론을. 해당 undef
개체에 액세스 할 수 없습니다. 메서드 정의에만 있고 본문에는 존재하지 않습니다. 기본 값 (위의 'World'
과 같이)으로 채워지거나 모든 메소드 매개 변수를 지정하지 않았기 때문에 ArgumentError
이 표시됩니다.
- 1. Ruby의 ThreadGroup은 무엇입니까?
- 2. Ruby의 실제 문제는 무엇입니까?
- 3. Ruby의 ObjectSpace에 해당하는 Python은 무엇입니까?
- 4. Ruby의 SciPy와 같은 것은 무엇입니까?
- 5. 학습 할 Ruby의 버전은 무엇입니까?
- 6. Ruby의 ScopeGates
- 7. Ruby의 TSV -> CSV
- 8. Ruby의 시간 제한 계산
- 9. Ruby의 파일 열기 모드
- 10. Ruby의 별칭 attr_reader
- 11. Ruby의 가비지 콜렉션 디버깅
- 12. Ruby의 ActiveResource로 JSON 포맷을 사용하는 방법은 무엇입니까?
- 13. Ruby의 "inspect"와 동일한 Python은 무엇입니까?
- 14. Ruby의 기본 GUI 프레임 워크는 무엇입니까?
- 15. Ruby의 암시 적 반환 값은 무엇입니까?
- 16. Ruby의 조상은 무엇이며 그 용도는 무엇입니까?
- 17. Ruby의 채널 이동
- 18. Ruby의 웹 사이트에서 파일 호출
- 19. RUBY의 컴파일러와 인터프리터
- 20. Ruby의 생성자에 대한 NameError
- 21. Ruby의 더 예쁜 코드
- 22. Ruby의 Rijndael 암호화
- 23. Ruby의 고급 배열 정렬
- 24. Ruby의 정식 파일 경로
- 25. Ruby의 Windows GetTickCount
- 26. ruby의 이진 검색 트리
- 27. Ruby의 연산자와 메소드
- 28. Ruby의 시차 표시
- 29. Ruby의 .next_month와 관련된 문제
- 30. sqlite3-ruby의 로컬 설치
나는 그것이 무엇인지 모르지만, 아마 메서드를 정의 해제하는 데 사용되는'undef' 메서드와 관련이 없습니다. –
@Andrew Grimm 예, 동의합니다! –