Merge pull request #4497 from ethereum/faq-reorg-control-structures

Move control structure related FAQ points
This commit is contained in:
chriseth 2018-11-12 14:37:34 +01:00 committed by GitHub
commit 288582e38e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 32 deletions

View File

@ -2,7 +2,7 @@
Expressions and Control Structures Expressions and Control Structures
################################## ##################################
.. index:: ! parameter, parameter;input, parameter;output .. index:: ! parameter, parameter;input, parameter;output, parameter;multiple
Input Parameters and Output Parameters Input Parameters and Output Parameters
====================================== ======================================
@ -32,6 +32,8 @@ something like::
Input parameters can be used just as any other local variable Input parameters can be used just as any other local variable
can be used, they can also be assigned to. can be used, they can also be assigned to.
.. index:: return array, return string, array, string, array of strings, dynamic array, variably sized array, return struct, struct
Output Parameters Output Parameters
----------------- -----------------
@ -54,12 +56,21 @@ write::
} }
The names of output parameters can be omitted. The names of output parameters can be omitted.
The output values can also be specified using ``return`` statements, The return values can be specified using ``return`` statements,
which are also capable of :ref:`returning multiple values<multi-return>`. which are also capable of :ref:`returning multiple values<multi-return>`.
Return parameters can be used as any other local variable and they Return parameters can be used as any other local variable and they
are zero-initialized; if they are not explicitly are zero-initialized; if they are not explicitly
set, they stay zero. set, they stay zero.
.. note::
You cannot return some types from non-internal functions, notably
multi-dimensional dynamic arrays and structs. If you enable the
new experimental ``ABIEncoderV2`` feature by adding ``pragma experimental
ABIEncoderV2;`` to your source file then more types are available, but
``mapping`` types are still limited to inside a single contract and you
cannot transfer them.
.. index:: if, else, while, do/while, for, break, continue, return, switch, goto .. index:: if, else, while, do/while, for, break, continue, return, switch, goto
Control Structures Control Structures
@ -120,8 +131,8 @@ External Function Calls
The expressions ``this.g(8);`` and ``c.g(2);`` (where ``c`` is a contract The expressions ``this.g(8);`` and ``c.g(2);`` (where ``c`` is a contract
instance) are also valid function calls, but this time, the function instance) are also valid function calls, but this time, the function
will be called "externally", via a message call and not directly via jumps. will be called "externally", via a message call and not directly via jumps.
Please note that function calls on ``this`` cannot be used in the constructor, as the Please note that function calls on ``this`` cannot be used in the constructor,
actual contract has not been created yet. as the actual contract has not been created yet.
Functions of other contracts have to be called externally. For an external call, Functions of other contracts have to be called externally. For an external call,
all function arguments have to be copied to memory. all function arguments have to be copied to memory.
@ -130,8 +141,10 @@ all function arguments have to be copied to memory.
A function call from one contract to another does not create its own transaction, A function call from one contract to another does not create its own transaction,
it is a message call as part of the overall transaction. it is a message call as part of the overall transaction.
When calling functions of other contracts, the amount of Wei sent with the call and When calling functions of other contracts, you can specify the amount of Wei or gas sent with the call with the special options ``.value()`` and ``.gas()``, respectively. Any Wei you send to the contract is added to the total balance of the contract:
the gas can be specified with special options ``.value()`` and ``.gas()``, respectively::
::
pragma solidity >=0.4.0 <0.6.0; pragma solidity >=0.4.0 <0.6.0;
@ -400,7 +413,7 @@ In any case, you will get a warning about the outer variable being shadowed.
} }
} }
.. index:: ! exception, ! throw, ! assert, ! require, ! revert .. index:: ! exception, ! throw, ! assert, ! require, ! revert, ! errors
.. _assert-and-require: .. _assert-and-require:

View File

@ -38,11 +38,6 @@ has it (which includes `Remix <https://remix.ethereum.org/>`_), then
``contractname.kill.sendTransaction({from:eth.coinbase})``, just the same as my ``contractname.kill.sendTransaction({from:eth.coinbase})``, just the same as my
examples. examples.
Can you return an array or a ``string`` from a solidity function call?
======================================================================
Yes. See `array_receiver_and_returner.sol <https://github.com/fivedogit/solidity-baby-steps/blob/master/contracts/60_array_receiver_and_returner.sol>`_.
Is it possible to in-line initialize an array like so: ``string[] myarray = ["a", "b"];`` Is it possible to in-line initialize an array like so: ``string[] myarray = ["a", "b"];``
========================================================================================= =========================================================================================
@ -61,11 +56,6 @@ Example::
} }
} }
Can a contract function return a ``struct``?
============================================
Yes, but only in ``internal`` function calls or if ``pragma experimental "ABIEncoderV2";`` is used.
If I return an ``enum``, I only get integer values in web3.js. How to get the named values? If I return an ``enum``, I only get integer values in web3.js. How to get the named values?
=========================================================================================== ===========================================================================================
@ -103,15 +93,6 @@ How do structs work?
See `struct_and_for_loop_tester.sol <https://github.com/fivedogit/solidity-baby-steps/blob/master/contracts/65_struct_and_for_loop_tester.sol>`_. See `struct_and_for_loop_tester.sol <https://github.com/fivedogit/solidity-baby-steps/blob/master/contracts/65_struct_and_for_loop_tester.sol>`_.
How do for loops work?
======================
Very similar to JavaScript. Such as the following example:
``for (uint i = 0; i < a.length; i ++) { a[i] = i; }``
See `struct_and_for_loop_tester.sol <https://github.com/fivedogit/solidity-baby-steps/blob/master/contracts/65_struct_and_for_loop_tester.sol>`_.
What are some examples of basic string manipulation (``substring``, ``indexOf``, ``charAt``, etc)? What are some examples of basic string manipulation (``substring``, ``indexOf``, ``charAt``, etc)?
================================================================================================== ==================================================================================================
@ -292,12 +273,6 @@ In this example::
} }
} }
Can a contract function accept a two-dimensional array?
=======================================================
If you want to pass two-dimensional arrays across non-internal functions,
you most likely need to use ``pragma experimental "ABIEncoderV2";``.
What is the relationship between ``bytes32`` and ``string``? Why is it that ``bytes32 somevar = "stringliteral";`` works and what does the saved 32-byte hex value mean? What is the relationship between ``bytes32`` and ``string``? Why is it that ``bytes32 somevar = "stringliteral";`` works and what does the saved 32-byte hex value mean?
======================================================================================================================================================================== ========================================================================================================================================================================