원래는 아래 소스를 돌리다 보니 Fixnum 이 Immutable 이구나… 라고 생각했는데
def print_oid(*objs)
objs.each do |obj|
print obj.__id__.to_s + " // "
end
puts
end
#fixnum = Fixnum.new(7) # Fixnum.new Not Found!!
a = 5
b = a
print_oid a, b
a = a + 1
print_oid a, b
c = 6
print_oid a, b, c
|
결과 >>
11 // 11 //
13 // 11 //
13 // 11 // 13 //
대충 내용은 Fixnum은 존재하는 클래스가 아니라 가짜 클래스라는 것 같다.
그러고 보니 Fixnum#new 가 없는 것도(private도 아니고) 왠지 이상하긴 하다.
그리고, 포스트의 리플을 보니 oid 와 값 사이에 규칙이 있다. 바로 Fixnum의 값은 (oid-1) / 2 라는 것.
규칙대로라면, oid 가 양의 정수가 되기 위해서는 당연하게도 Fixnum 의 oid는 홀수여야 한다.
그렇다면 Fixnum 이 아닌 모든 객체들의 oid 는 당연히 짝수가 된다. (겹치지 않게 하기 위함)
그래서 일단 닥치고 실험에 들어갔다.
계속 객체를 생성해서 oid가 홀수가 나오는지 확인하고 나오면 장땡, 안 나오면 위의 가정이 대충 맞아떨어져가는 것…
(0..1000000).each do |i|
str = "Ruby Fixnum is immutable? Or Fake Class?"
puts str.__id__ if str.__id__ % 2 == 1
end
|
결과 >>
음… 짝수만 나온다. 근데 이걸로는 확신은 못한다.
그래서 자료를 더 찾아봤는데, 관련 포스트를 발견했다.
http://www.neeraj.name/blog/articles/662-why-the-id-of-nil-is-4-in-ruby
중점만 짚자면 루비 내부 설계상 oid의 홀수는 Fixnum 구현을 위해 예약해 놓았다는 것이다.
호오… 흥미롭군요…
'Dev.Programming > Lang.Ruby' 카테고리의 다른 글
| Hpricot 으로 XML 을 파싱하면... (0) | 2009/04/23 |
|---|---|
| Ruby 로 만든 어플리케이션을 배포하는 방법 (4) | 2009/04/15 |
| 신기한 Ruby 의 Fixnum (0) | 2009/04/01 |
| 워드프레스에서 티스토리로 이사옴 (9) | 2009/02/27 |
| Ruby 로 만든 첫 프로그램 : DC 프갤 첫 페이지 RSS (2) | 2009/01/29 |
| Ruby 개발 툴 선택... (0) | 2009/01/29 |


