簡體   English   中英

Smalltallk - 如何在類的對象(當前實例)中獲取所有實例變量的數組(或集合)?

[英]Smalltallk - How can I get an Array (or Collection) of the all the Instance variables in an Object (the current Instance) of a Class?

假設我們有一個類,我們實例化它,創建該類的實例。 該實例有一些我需要使用的由類定義的(實例)變量。 我想將所有這些(實例)變量放在一個數組或一些Collection中,這樣我就可以迭代它們並將它們設置為某個值,而不是nil。

我怎樣才能做到這一點?

我想建立@Uko的答案,因為有更直接的方式來實現他的想法。

發送給Class的消息instSize將回答其實例的命名實例變量的數量。 當然,這將包括在超類中定義的實例變量。

例如, RemoteTempVectorNode instSize以17答案(哇!)。 因此你可以這樣做:

fields := (1 to: anObject class instSize) collect: [:i | anObject instVarAt: i]

然后,改為:

values withIndexDo: [:v :i | anObject instVarAt: i put: v]

其中values是要注入對象的新值數組。

那么,為什么我建議這樣而不是instVarNamed: 因為后者是間接的。 如果你看看它的實現,你會發現它必須首先通過發送instVarIndexFor:ifAbsent:來找到第i個ivar的名字到對象的類。 換句話說,如果您需要ivar名稱,請遵循@ Uko的建議; 否則不要將它們放入等式中,因為它們只會為程序添加CPU周期。

還有一件事 正如@Sean DeNegris在對你的問題的評論中明智地提出的那樣,如果你詳細說明為什么你需要這種不尋常的機動,那將是有益的。


編輯:

既然Pharo具有靈活的對象布局,則inst var名稱和類instSize之間的映射不再有效(在使用新功能的類中)。因此,使用僅索引的簡單方法不具有通用性。 實際上,在新的“分類法”下,對象的instSize (字段數)可能與#numberOfInstanceVariables不同。 我想增加的靈活性有它的成本和好處。

您可以將#allInstVarNames發送到類(Behavior)以獲取由它和超類定義的所有實例變量的名稱。 如果不需要超類變量,可以使用#instVarNames

假設var是您需要使用的變量。 然后,您可以獲取實例變量名稱的集合並迭代它們。

您可以使用#instVarNamed:put:通過名稱來設置實例變量,並#instVarNamed:通過名字來獲取值(如果你需要)。

我認為這樣的事情可能對你有所幫助:

var class allInstVarNames do: [ :instVarName |
  var instVarNamed: instVarName put: <yourValue>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM