Solidity

在不循環的情況下增加映射或數組的所有值

  • December 13, 2017

是否可以增加映射或數組的所有值(沒有循環)?

例子:

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 只會影響某些地址,而不是所有地址。

引用自:https://ethereum.stackexchange.com/questions/33143