所有的參考型別都有一個額外注解(storage、memory、calldata),來說明資料的存盤位置,上節提到的mapping、struct、array都是參考型別
storage- storage變數永久存盤在區塊鏈上memory- memory變數則是臨時的,當函式呼叫完成時被移除calldata- 效果同memory,只不過用在external函式呼叫中
資料存盤位置不同,賦值行為也會不同,下面看幾個案例:
-
storage to storage
storage狀態變數 -> storage狀態變數 之間賦值是通過值拷貝,對一個變數值的修改不會影響另一個變數
storage狀態變數 -> storage區域變數 之間賦值是通過參考傳遞,對一個變數值的修改會影響另一個變數
contract LocationTest { struct person{ string name; } person p1; person p2; function f() public{ person storage p3 = p1; //p3是一個storage point p3.name = "A"; //此時 p1.name = A p2 = p3; //同p2 = p1,這里只是賦值 p3.name = "B"; //此時 p1.name = B ,p2.name = A } }2.memory to memory
memory -> memory 之間賦值是通過值拷貝,對一個變數值的修改不會影響另一個變數
contract LocationTest { struct person{ string name; } function f() public{ person memory p1 = person("A"); person memory p2 = p1; p2.name = "B"; //p2.name = B ,p1.name= A } }-
storage to memory
memory -> storage狀態變數 之間賦值是通過值拷貝,對一個變數值的修改不會影響另一個變數
memory 無法賦值給 storage 區域變數,因為 storage 區域變數 是一個storage point
contract LocationTest { struct person{ string name; } person p1; function f() public{ person memory p2 = person("A"); p1 = p2; p2.name = "B"; //p1.name =A ;p2.name= B // person storage p3 = p2; 不能賦值 } function get() public view returns(string memory){ return p1.name; } }
-
?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/340501.html
標籤:區塊鏈
