Solidity

儲存值是否被複製或引用?

  • December 1, 2021

鑑於這份契約

contract C {
   struct Product { uint price }
   Product[] storage products;

   function doSomething() {
       products.push(Product({price: 100}));
       products.push(Product({price: 200}));
       products[0] = products[1];
       products[1].price = 300;
   }
}

最終價格是products[0]200還是300?

(作為後續的 n00b 問題,我如何在 Solidity 中執行這樣的單個函式,以便我可以看到結果是什麼,而無需在區塊鏈上啟動合約?)

是產品的最終價格

$$ 0 $$200還是300?

這是200因為從儲存到儲存的分配總是會創建一個副本,正如您在此處看到的那樣。

“所有其他對儲存的分配總是複制。這種情況的例子是對狀態變數或儲存結構類型的局部變數成員的分配,即使局部變數本身只是一個引用。”

正如另一個答案指出的那樣,測試程式碼的最簡單方法可能是 Remix。

您可以使用 Ethereum Remix 來測試您的合約而無需部署它:https ://remix.ethereum.org

在 Remix 上測試它似乎數組的值沒有引用:

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

contract C {
   // correct syntax
   struct Product { 
       uint price;
   }
   // 'products' is declared as contract property,
   // thus it's already a state variable
   // no need to make it 'storage'
   Product[] products;

   function doSomething() public {
       products.push(Product({price: 100}));
       products.push(Product({price: 200}));
       products[0] = products[1];
       products[1].price = 300;
   }

   // for _index = 0 it will return price 200
   // for _index = 1 it will return price 300
   function getProductAtIndex(uint _index) public view returns(Product memory) {
       return products[_index];
   }
}

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