在玩GNU Smalltalk中的Array
類時,我驚訝於#at:put:
消息屬於類SmallInteger
而不是類Array
(或任何其他超類Array
)。爲什麼?爲什麼#at:put:在SmallInteger的GNU Smalltalk消息中?
0
A
回答
4
#at:put:
定義於Object
。 SmallInteger
確實將它重新定義爲拋出一個異常,因爲它不是可編入索引的,並且任何子類也是不可索引的。
這也有點棘手。
朗解釋:
1)SmallInteger
只是翻譯成VM整數。 事實上,在VM中SmallInteger
a
被翻譯成(a bitShift: 1) bitOr: 1
。
2)#at:put:
是檢查類是否可索引的原語。可轉位對象是可以發送的對象#at:put:
,#at:
並且必須通過#new:
實例化。這是實現變量的唯一方法。 (切線:OrderedCollection
正在實例化其他可索引對象,讓您多次呼叫#add:
,感覺長度無限)。
3)知道如果#at:put:
未在SmallIntager
類中重新定義,該原語將不得不首先檢查對象是否爲SmallInteger
,然後檢查它是否可索引。這會造成你一些性能損失。並重新定義#at:put:
SmallInteger
只需刪除SmallInteger
檢查。
相關問題
- 1. 爲什麼GNU Smalltalk在方法體中使用括號?
- 2. 在Smalltalk中返回消息
- 3. 開發UI在GNU/Smalltalk中
- 4. GNU Smalltalk API?
- 5. GNU Smalltalk - 格式化輸出和禁用GC消息
- 6. ANSI轉義代碼在GNU Smalltalk中
- 7. 如何在GNU Smalltalk中繼承OrderedCollection?
- 8. 在GNU Smalltalk中定義和調用函數的正確方法是什麼?
- 9. GNU Smalltalk中的圖像或文件?
- 10. 哪個SCM for GNU/Smalltalk?
- 11. 什麼用於在ActiveMQ中重放消息以及爲什麼?
- 12. 爲什麼flash消息不會消失?
- 13. GNU C++錯誤消息
- 14. Smalltalk/Squeak消息處理方法
- 15. 什麼是Smalltalk的sinatra?
- 16. Smalltalk式消息與C式函數
- 17. 安裝gnu smalltalk時遇到的問題
- 18. 爲什麼我的消息驅動Bean停止處理消息?
- 19. 爲什麼WM_ERASEBKGND有單獨的消息
- 20. 爲什麼沒有執行回調? - Smalltalk
- 21. rabbitMq 3.6.5中的慢消息消耗。爲什麼?
- 22. 爲什麼在MFC中接收錯誤消息而不是定時器消息?
- 23. 爲什麼我在Haskell中爲堆棧溢出發送消息?
- 24. 爲什麼用C消息框中++展示中國信息
- 25. 如何在Smalltalk中以編程方式替換消息主體?
- 26. 如何在SmallTalk(Pharo)中獲得消息發送者?
- 27. C GNU-isms存在什麼?
- 28. 什麼是Smalltalk「圖像」?
- 29. 爲什麼消息採樣處理器停止探測消息?
- 30. 爲什麼通過refrance傳遞在PHP中的通知消息?
感謝您的啓示:-)但是當#at:put:在類Object中定義時,意味着我必須在每個不可索引類中重新定義此消息? – Marc 2011-06-16 13:04:14
Nop僅適用於由VM以不同方式處理的問題。只有當你決定攻擊虛擬機時纔會發生這種情況。 – mathk 2011-06-17 07:59:50