2012-05-16 36 views
3

我在Smalltak noobie,但我需要了解我的論文的一些事情。創建字符串或其他對象時究竟發生了什麼?例如,讓我們這樣做:在smalltalk中創建字符串時會發生什麼?

fruit <- 'apple' 

當我嘗試檢查對象水果時,我看到它有5個變量。如果我把「梨」分配給水果,它會有四個變量。所以解釋器創建了bytestring的新實例,爲每個字符添加了所需的inst vars併爲它們分配了適當的值?我相信還會有更多的事情發生,但我無法在任何地方找到它,而且我沒有時間正確地學習smalltalk。你能解釋給我,還是給我一些鏈接,我可以找到它?

+1

「我沒有時間好好學Smalltalk:你爲什麼在Smalltalk中尋找呢? – Mark

+0

我需要它作爲我的學校論文。我正在做一些比較少數幾種編程語言的東西。 – peto1234

回答

5

字符串是對象。對象包含實例變量並響應消息。在Smalltalk中,基本上有兩種實例變量:名稱實例變量由名稱引用(如Person對象中的name或phoneNumber),並且索引實例變量由數字引用。字符串使用索引實例變量。

考慮下面的例子:

fruit := String new: 5. 
fruit at: 1 put: $a; 
    at: 2 put: $p; 
    at: 3 put: $p; 
    at: 4 put: $l; 
    at: 5 put: $e. 

這產生與5個字符空格的字符串。然後它得到水果變量指向那個對象。然後它在字符串中寫入5個字符。結果是字符串'apple'。

由於字符串如此常用,編譯器支持在編譯時創建字符串的特殊語法。

fruit := 'apple' 

在這個例子中,'apple'是一個字符串文字。 Smalltalk編譯器在編譯該行時創建該字符串。當你運行這一行時,你將使得水果指向字符串'apple',它具有5個包含Character對象的索引實例變量。

+0

瑣碎的迂腐問題大衛的分析......在字節的可轉位對象的情況下,你仍然認爲這是正確的稱它們爲在索引實例變量。字節索引對象中的「字節」是否真的是對象?您可以獲取表示它們的對象(字符和數字),但它們與這些字節不同。 IOW,「Apple」代表內存管理器必須擔心的一個對象,而不是1 + 5.這當然超過了「入門級」的解釋。 –

+0

是的,它們是以不同的方式實現的,但Smalltalk程序員的外觀就是它們表現得像對象一樣。語言實施者如何選擇代表數據並不重要。如果它看起來像一個對象並且表現得像一個對象那麼它就是一個對象。我聽說它用電腦語言說,只要你不被抓到就可以作弊。如果你給了我一棵在各方面與真樹無法區分的假樹,那麼我仍然會稱它爲一棵樹。那對形而上學來說如何? –

3

字符串是可轉位的對象,這意味着它們是數組和插槽編號,而不是「標着」 ...

4

他們不是實例變量,他們在可轉位對象位置,非常相似當你創建一個數組或任何其他類型的集合時會發生什麼。

Smalltalk中的字符串只是一個字符集合,其中每個字符都存儲在字符串中佔據的位置。

一些例子,讓你與字符串是就像陣列結識:

'Good Morning' at: 3. 
#(1 'hi' $d 5.34) at: 3. 

'Good Morning' fourth. 
#(1 'hi' $d 5.34) fourth. 

'Good Morning' reversed. 
#(1 'hi' $d 5.34) reversed. 

'Good Morning' select: [ :each | each ~= $d ]. 
#(1 'hi' $d 5.34) select: [ :each | each ~= $d ]. 

正如你所看到的,字符串只是另一種收藏。

3

首先,您作爲示例給出的表達式不會創建字符串。 這是簡單的任務。

fruit := 'apple' 

不會創建字符串。它將現有的字符串'apple'分配給水果變量。 如果您要創建新的strins,你應該使用 (字節)字符串新: 類似 數組新:..

這是怎麼編譯器編譯源代碼時實際創建新的字符串。

+0

但編譯器開始處理語句之前'apple'字符串不存在?我的意思當然包括 –

相關問題