[英]How to access an element in 2d array in Smalltalk
我開始在 Smalltalk 中編碼並被困在這里。 我有這個二維數組:
testArr := Array new: 1.
testArr at: 1
put: ((Array new: 3)
at: 1 put: '1A';
at: 2 put: '1B';
at: 3 put: '1C';
yourself).
但是如果我想訪問讓我們說第一個數組的第一個元素,我應該寫什么來讓它發生?
謝謝!
我很想利用您的問答,詳細闡述屬於 Smalltalk 民間傳說的知識(您可能已經知道)。
隨着我們使用 Smalltalk 的進展,我們可能會注意到Array
類在我們的模型中開始發揮越來越小的作用。 這是為什么? 因為找出我們的模型將生成哪些對象需要時間; 太多和太少之間的平衡是一個微妙的問題,一開始大多是毫無頭緒的。
數組及其組成是方便的數據結構。 然而,它們以處理數據為代價來解決組織數據的問題。 如果這種結構的客戶端需要知道數據如何存儲作為對其采取行動的先決條件,那么消息范式在語義上就會變得空閑。
讓我們想象一個矩陣對象。 有幾種方法可以保留它們的條目:一維數組、行數組、列數組、(稀疏)非空條目字典、三角形結構(如果矩陣已知為對稱/反矩陣)對稱/厄米,以及更多特殊情況。 當然,這種多樣性對於手頭的問題是沒有意義的,無論如何,花時間考慮最通用的方法是一個壞主意:在 Smalltalk 中,通用性是在消息中獲得的,而不是在存儲中。
不管數據的內部組織如何,我們的對象應該始終提供獨立於底層結構的協議。 回到矩陣示例,即使我們最初的組織是行數組,無論行是數組還是用於其他目的的更復雜的向量對象,矩陣對象都應該以相同的方式工作。 這意味着在對條目(i,j)
的內部訪問進行編碼時(i,j)
我們應該假裝我們不知道第i
行的類別,而只知道訪問其第j
個元素的消息。 一些關於
atRow: i column: j
| row |
row := self row: i.
^row at: j
這里我們不假設row
是一個Array
; 我們只是假設它理解at:
消息,這是我們在與行對象交談時至少可以假設的,無論其實際性質如何。 當然,此代碼僅在假設行不會動態重新創建的情況下才有效,就像我們的類保留列的集合一樣。 但這沒關系,否則我們只需要添加另一個類並覆蓋它和其他一些低級消息。
無論如何,我們的想法是盡可能推遲任何有關內部組織的明確知識,以便將其限制在一些私人消息中。 測試我們正在應用這種良好實踐的一種方法是確保在兩種或多種方法中沒有低級代碼重復。 例如,上面的row:
消息的使用將低級代碼從atRow:column:
,將其推遲到另一個對(理想的)矩陣協議有意義的代碼。
這個例子說明了一個重要的點:對需要組合兩個at:
消息的任何代碼保持懷疑。 而且——為什么不——享受不必聲明類型的美妙。
所以,問題在括號中。
^(testArr at: 1) at:1
回報
1A
我需要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.