Solidity
在不循環的情況下增加映射或數組的所有值
是否可以增加映射或數組的所有值(沒有循環)?
例子:
mapping(address => uint) score; uint[] values; function increase_scores() public { // Example pseudo-code for mapping and array: score.all += 1; // ?? values += 1; // Ex.Something like the python map(lambda x: x+1,list) ?? }
編輯:為了提供更多上下文,我有一個使用者和分數的映射。每次我呼叫函式increase_scores時,我都想增加映射的所有使用者的分數。因此,我不想在整個陣列上循環,因為如果有很多使用者,我可能會用完 gas。
編輯:python的地圖範例最後也不是一個好主意,因為它必須遍歷所有數組或映射……它也會用完gas。循環沒有區別。
正如 Rob 所建議的那樣,您可以做的 - 因為迭代映射是不可能的,如果它是一個數組,它會很昂貴 - 是動態計算值。
假設您有幾個分數映射到地址。
地址 - 分數
0x1 - 3
0x2 - 4
0x3 - 2
您的初衷是迭代映射的每個元素以增加分數,這是不可行的。
您可以做的是添加一個狀態變數
uint scoreIncrement
,該變數跟踪所有分數的分數增加了多少次。function increase_scores() public { scoreIncrement++; }
然後,你有一個返回元素分數的函式,加上 scoreIncrement。
function getScore(address _a) public returns (uint){ return scores[_a] + scoreIncrement; }
因此,您可以呼叫此函式,而不是直接訪問分數映射的元素。
您可以為此添加更多邏輯。您可能也不想增加將來添加的每個分數。因此,您可能也想使用時間戳或對地址進行分組,因此給定的 scoreIncrement 只會影響某些地址,而不是所有地址。