在前面2天我們了解到物件們的相互關係,而今天我們來討論一下有哪些東西不是物件。
變數是幾乎所有程式語言都需要的東西,然而在 Ruby 中,變數不像 JS 可以只做宣告而不指定,也就是說變數宣告必定會將一個 value
指定給該變數,這不禁會讓人懷疑一下, variable 或許只是作為該 value 的標籤或代名詞而已。
a_variable = 10
a_variable.object_id # 印出 21
10.object_id # 印出 21
用 object_id
這個方法可以找出 Ruby 給予該物件的編號,可以發現變數的編號和它被指定的值相同,那如果沒有做變數宣告呢?可想而知那 Ruby 會直接不承認這個變數存在 undefined local variable or method 'a' for main:Object
。
其實賦值運算子 =
可以看成是一個 貼標籤
的行為,不要想成數學的左邊等於右邊了。
def a_method
end
a_method.object_id # 印出 8
我們把方法也拿來試試,這裡會發現是可以得到 object id 的,不過如果多玩幾次 object_id
這個方法應該會發現一件事,除了 integer 可以看出 id 是 (2n + 1) 以外,自己所新宣告的物件 id 的絕對值都非常的大。
"little_genius".object_id # 印出 70204642204120
0.object_id # 印出 1
0.5.object_id # 印出 -72057594037927934
那麼上面的 object id 8 就顯得很奇特了
def another_method
10
end
another_method.object_id # 印出 21
宣告一個有回傳值的方法可以發現,原來方法所得到的 object id 就是回傳值的 object id ,那麼這個 8 是哪來的大家應該知道了吧?!
puts nil.object_id # 印出 8
下一篇來說說最有名的非物件 block
吧!
此文同步刊登於CJ-Han的網站