Move string manipulation FAQ items to type docs

Update docs/types/value-types.rst

Co-Authored-By: ChrisChinchilla <chriswhward@gmail.com>

Update docs/types/value-types.rst

Co-Authored-By: ChrisChinchilla <chriswhward@gmail.com>

Fixed formatting

Re-add example

Clarify text

Rearrange string manipulation
This commit is contained in:
Chris Ward 2019-01-16 15:43:47 +02:00
parent fd3bdcb747
commit 9a8882c9fc
4 changed files with 16 additions and 46 deletions

View File

@ -264,9 +264,9 @@ Complications for Arrays and Structs
The semantics of assignments are a bit more complicated for non-value types like 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. 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 In the example below the call to ``g(x)`` has no effect on ``x`` because it creates
to create an independent copy of the storage value in memory. However ``h(x)`` modifies ``x`` because a reference and an independent copy of the storage value in memory. However, ``h(x)`` successfully modifies ``x``
not a copy is passed. because only a reference and not a copy is passed.
:: ::

View File

@ -16,44 +16,6 @@ Enums are not supported by the ABI, they are just supported by Solidity.
You have to do the mapping yourself for now, we might provide some help You have to do the mapping yourself for now, we might provide some help
later. later.
What are some examples of basic string manipulation (``substring``, ``indexOf``, ``charAt``, etc)?
==================================================================================================
There are some string utility functions at `stringUtils.sol <https://github.com/ethereum/dapp-bin/blob/master/library/stringUtils.sol>`_
which will be extended in the future. In addition, Arachnid has written `solidity-stringutils <https://github.com/Arachnid/solidity-stringutils>`_.
For now, if you want to modify a string (even when you only want to know its length),
you should always convert it to a ``bytes`` first::
pragma solidity >=0.4.0 <0.6.0;
contract C {
string s;
function append(byte c) public {
bytes(s).push(c);
}
function set(uint i, byte c) public {
bytes(s)[i] = c;
}
}
Can I concatenate two strings?
==============================
Yes, you can use ``abi.encodePacked``::
pragma solidity >=0.4.0 <0.6.0;
library ConcatHelper {
function concat(bytes memory a, bytes memory b)
internal pure returns (bytes memory) {
return abi.encodePacked(a, b);
}
}
****************** ******************
Advanced Questions Advanced Questions
****************** ******************

View File

@ -106,13 +106,24 @@ Array elements can be of any type, including mapping or struct. The general
restrictions for types apply, in that mappings can only be stored in the restrictions for types apply, in that mappings can only be stored in the
``storage`` data location and publicly-visible functions need parameters that are :ref:`ABI types <ABI>`. ``storage`` data location and publicly-visible functions need parameters that are :ref:`ABI types <ABI>`.
It is possible to mark arrays ``public`` and have Solidity create a :ref:`getter <visibility-and-getters>`.
The numeric index becomes a required parameter for the getter.
Accessing an array past its end causes a failing assertion. You can use the ``.push()`` method to append a new element at the end or assign to the ``.length`` :ref:`member <array-members>` to change the size (see below for caveats). Accessing an array past its end causes a failing assertion. You can use the ``.push()`` method to append a new element at the end or assign to the ``.length`` :ref:`member <array-members>` to change the size (see below for caveats).
method or increase the ``.length`` :ref:`member <array-members>` to add elements. method or increase the ``.length`` :ref:`member <array-members>` to add elements.
``bytes`` and ``strings`` as Arrays
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Variables of type ``bytes`` and ``string`` are special arrays. A ``bytes`` is similar to ``byte[]``, Variables of type ``bytes`` and ``string`` are special arrays. A ``bytes`` is similar to ``byte[]``,
but it is packed tightly in calldata and memory. ``string`` is equal to ``bytes`` but does not allow but it is packed tightly in calldata and memory. ``string`` is equal to ``bytes`` but does not allow
length or index access. length or index access.
While Solidity does not have string manipulation functions, you can use
this implicit conversion for equivalent functionality. For example to compare
two strings ``keccak256(abi.encode(s1)) == keccak256(abi.encode(s2))``, or to
concatenate two strings already encoded with ``abi.encodePacked(s1, s2);``.
You should use ``bytes`` over ``byte[]`` because it is cheaper, since ``byte[]`` adds 31 padding bytes between the elements. As a general rule, You should use ``bytes`` over ``byte[]`` because it is cheaper, since ``byte[]`` adds 31 padding bytes between the elements. As a general rule,
use ``bytes`` for arbitrary-length raw byte data and ``string`` for arbitrary-length use ``bytes`` for arbitrary-length raw byte data and ``string`` for arbitrary-length
string (UTF-8) data. If you can limit the length to a certain number of bytes, string (UTF-8) data. If you can limit the length to a certain number of bytes,
@ -124,9 +135,6 @@ always use one of the value types ``bytes1`` to ``bytes32`` because they are muc
that you are accessing the low-level bytes of the UTF-8 representation, that you are accessing the low-level bytes of the UTF-8 representation,
and not the individual characters. and not the individual characters.
It is possible to mark arrays ``public`` and have Solidity create a :ref:`getter <visibility-and-getters>`.
The numeric index becomes a required parameter for the getter.
.. index:: ! array;allocating, new .. index:: ! array;allocating, new
Allocating Memory Arrays Allocating Memory Arrays