2015-09-27 65 views
3

我在Smalltalk中有一個存儲OrderedCollection對象的類。每個對象都有一個名稱。我想遍歷OrderedCollection對象並打印出每個這些對象的名稱。例如,在Java中我會是這樣的:如何在Smalltalk中打印來自OrderedCollection的對象數據

for(int i = 0; i < array.length; ++i) { 
    System.out.println(array[i].getName()); 
} 

這是我在Smalltalk,其中「目錄」是OrderedCollection多遠了:

1 to: list size do: [ 
:x | Transcript show: 'The object name:' list at: x printString; cr. 
] 
+3

'list do:[:object |成績單顯示:'對象名稱',對象名稱; cr]' –

+0

在Java中,爲了枚舉一個數組'foo',你可以更簡潔的寫出'for(int i:foo){...}'這更接近於正確地使用Smalltalk ,'foo do:[:each | ...]。 – lurker

回答

8

你的解決方案是不錯的,除了兩個小失誤:(1)你忘了一些括號和(2)的串聯消息#,丟失:

應該已經

1 to: list size do: [ 
    :x | Transcript show: 'The object name:' , (list at: x) printString; cr. 
] 

否則Transcript對象將收到消息#show:at:,它不理解。此外,您必須連接字符串'The object name: '(list at: x) printString,這就是爲什麼您需要在它們之間連接消息#,

但請注意,在您的示例中不需要使用索引。相反,從1迭代到list size的,你可以簡單地列舉對象list集合中,像這樣的:

list do: [:object | Transcript show: 'The object name: ' , object printString; cr] 

這種形式通常是首選,因爲它避免了使用中間指數(x在你的例子)和力您可以使用#at:訪問集合的第x-個元素,所有這些都使您的代碼更易於閱讀和修改。

+3

+1,但我還要補充一點,在Smalltalk中,迭代變量被稱爲'each'或'eachSomething'是合適的,以強調它的迭代性質,並且我們正在爲_each_值做一些事情列表。爲了更加迂腐,我會盡量不要調用你的集合'list',因爲它將你與某個集合實現聯繫起來。 (如果你以後需要它成爲'Set'會怎樣?)相反,我建議OP使用複數名詞,比如說'accounts',或'objects',或者其他適用於你的域名的東西。 –

+2

好點@ AmosM.Carpenter。像「list」,「collection」等通用名稱只有在上下文使其含義明顯時才適用(例如Pharo中的'PositionableStream'的ivar'集合')。否則,更多的意圖揭示使用特定的名詞分類包含的元素。由於這個原因非常相同,我通常不會使用'each'作爲泛型枚舉變量,而是改爲'accounts do:[:account | ]'。無論如何,幫助人們學習民俗習俗總是有價值的。 –

+2

獲取兩全其美,並使用'accounts do:[:eachAccount | ]'。從不傷害是明確的,如果有人查看嵌套深度幾層的代碼行,而無需查看上下文,他們一眼就能知道「eachAccount」是迭代變量,而「 account'可以是一個實例變量或一個temp。這個慣例有一個很好的理由。 :-) –

相關問題