원래는 아래 소스를 돌리다 보니 Fixnum 이 Immutable 이구나… 라고 생각했는데

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 //

 

http://www.rubyfleebie.com/understanding-fixnums

 

대충 내용은 Fixnum은 존재하는 클래스가 아니라 가짜 클래스라는 것 같다.

그러고 보니 Fixnum#new 가 없는 것도(private도 아니고) 왠지 이상하긴 하다.

 

그리고, 포스트의 리플을 보니 oid 와 값 사이에 규칙이 있다. 바로 Fixnum의 값은 (oid-1) / 2 라는 것.

규칙대로라면, oid 가 양의 정수가 되기 위해서는 당연하게도 Fixnum 의 oid는 홀수여야 한다.

그렇다면 Fixnum 이 아닌 모든 객체들의 oid 는 당연히 짝수가 된다. (겹치지 않게 하기 위함)

 

그래서 일단 닥치고 실험에 들어갔다.

계속 객체를 생성해서 oid가 홀수가 나오는지 확인하고 나오면 장땡, 안 나오면 위의 가정이 대충 맞아떨어져가는 것…

 

1
2
3
4
(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 구현을 위해 예약해 놓았다는 것이다.

 

호오… 흥미롭군요…

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Heart