# 賦值(Assignment)
## 解構賦值和返回多個結果(Destructing Assignments and Returning Multip Values)
Solidity內置支持`元組(tuple)`,也就是說支持一個可能的完全不同類型組成的一個列表,數量上是固定的(Tuple一般指兩個,還有個Triple一般指三個)。
這種內置結構可以同時返回多個結果,也可用于同時賦值給多個變量。
```
pragma solidity ^0.4.0;
contract C {
uint[] data;
function f() returns (uint, bool, uint) {
return (7, true, 2);
}
function g() {
// Declares and assigns the variables. Specifying the type explicitly is not possible.
var (x, b, y) = f();
// Assigns to a pre-existing variable.
(x, y) = (2, 7);
// Common trick to swap values -- does not work for non-value storage types.
(x, y) = (y, x);
// Components can be left out (also for variable declarations).
// If the tuple ends in an empty component,
// the rest of the values are discarded.
(data.length,) = f(); // Sets the length to 7
// The same can be done on the left side.
(,data[3]) = f(); // Sets data[3] to 2
// Components can only be left out at the left-hand-side of assignments, with
// one exception:
(x,) = (1,);
// (1,) is the only way to specify a 1-component tuple, because (1) is
// equivalent to 1.
}
}
```
## 數組和自定義結構體的復雜性(Complication for Arrays and Struts)
對于非值類型,比如數組和數組,賦值的語法有一些復雜。
- 賦值給一個狀態變量總是創建一個完全無關的拷貝。
- 賦值給一個局部變量,僅對基本類型,如那些32字節以內的`靜態類型(static types)`,創建一份完全無關拷貝。
- 如果是數據結構或者數組(包括`bytes`和`string`)類型,由狀態變量賦值為一個局部變量,局部變量只是持有原始狀態變量的一個引用。對這個局部變量再次賦值,并不會修改這個狀態變量,只是修改了引用。但修改這個本地引用變量的成員值,會改變狀態變量的值。
- Solidity語言
- 入門說明
- Solidity智能合約文件結構
- 智能合約源文件的基本要素概覽
- 值類型
- 類型
- 布爾
- 整型
- 地址
- 字節數組
- 小數
- 字符串
- 十六進制字面量
- 枚舉
- 函數
- 引用類型
- 引用類型
- 數據位置
- 數組
- 數據結構
- 雜項
- 映射
- 左值運算符
- 類型間的轉換
- 類型推斷
- 單位
- 貨幣單位
- 時間單位
- 語言內置特性
- 特殊變量及函數
- 數學和加密函數
- 地址相關
- 進階
- 入參和出參
- 控制結構
- 函數調用
- 創建合約實例
- 表達式的執行順序
- 賦值
- 作用范圍和聲明
- 異常
- 內聯匯編
- 合約詳解
- 合約
- 可見性或權限控制
- 訪問函數
- 函數修改器
- 常狀態變量
- 回退函數
- 事件
- 繼承
- 接口
- 其它
- 庫
- 狀態變量的存儲模型
- 內存變量的存局
- 調用數據的布局