diff options
author | Chris Ward <chris.ward@ethereum.org> | 2019-01-21 18:33:11 +0800 |
---|---|---|
committer | Chris Ward <chris.ward@ethereum.org> | 2019-01-21 18:33:11 +0800 |
commit | f39993ced653d6c34338e8aa85d7c664faa6af1d (patch) | |
tree | 2686fd7ac692e4b590fd9b5d50cf347273efaca1 | |
parent | b58a6a4a04ef10d19b24cf80866bfce33091136d (diff) | |
download | dexon-solidity-f39993ced653d6c34338e8aa85d7c664faa6af1d.tar.gz dexon-solidity-f39993ced653d6c34338e8aa85d7c664faa6af1d.tar.zst dexon-solidity-f39993ced653d6c34338e8aa85d7c664faa6af1d.zip |
Readd example
-rw-r--r-- | docs/control-structures.rst | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/docs/control-structures.rst b/docs/control-structures.rst index f32e7879..46b3a7f1 100644 --- a/docs/control-structures.rst +++ b/docs/control-structures.rst @@ -264,6 +264,31 @@ Complications for Arrays and Structs The semantics of assignments are a bit more complicated for non-value types like arrays and structs. Assigning *to* a state variable always creates an independent copy. On the other hand, assigning to a local variable creates an independent copy only for elementary types, i.e. static types that fit into 32 bytes. If structs or arrays (including ``bytes`` and ``string``) are assigned from a state variable to a local variable, the local variable holds a reference to the original state variable. A second assignment to the local variable does not modify the state but only changes the reference. Assignments to members (or elements) of the local variable *do* change the state. +In the example below the call to ``g(x)`` has no effect on ``x`` because it needs +to create an independent copy of the storage value in memory. However ``h(x)`` modifies ``x`` because a reference and +not a copy is passed. + +:: + + pragma solidity >=0.4.16 <0.6.0; + + contract C { + uint[20] x; + + function f() public { + g(x); + h(x); + } + + function g(uint[20] memory y) internal pure { + y[2] = 3; + } + + function h(uint[20] storage y) internal { + y[3] = 4; + } + } + .. index:: ! scoping, declarations, default value .. _default-value: |