Value Types
值類型是指當(dāng)傳遞這些類型時(shí),傳遞的是類型的取值袄膏。
bool
bool類型的取值位true,false,其用法和主流的語言類似。
int/uint
int 表示256位整形和無符號(hào)整形,還可以使用int8藤韵,int16...uint256* 表示8位,16位熊经。泽艘。。256位整形镐依。
uint8,uint16...uint256類似的使用方法類似匹涮。
fixed/ufixed
fixed 和其他語言中的 float,double表示的含義類似,代碼中使用方法如下:
fixedMxN decimal;
其中M表示位寬槐壳,必須位8的整數(shù)倍然低,N表示十進(jìn)制小數(shù)部分的位數(shù)。
address
address類型位的位寬位20個(gè)字節(jié)(160 bits),和區(qū)塊鏈上的地址長度一致脚翘。 address 類型還包含幾個(gè)成員可以被訪問:
- balance - 獲取該地址的余額
- transfer - 向該地址發(fā)送ether(以wei位單位)
- send - 和transfer功能類似灼卢,區(qū)別在于如果發(fā)送失敗send方法返回false,transfer方法會(huì)發(fā)生錯(cuò)誤
- call/delegatecall/callcode - 這幾個(gè)函數(shù)較為底層来农,后續(xù)章節(jié)單獨(dú)介紹
下面是一個(gè)例子:
pragma solidity ^0.4.23;
contract AddressTest {
event Transfered(address to, uint amount);
event Sent(address to, uint amount, bool successed);
//Get the ether balance of a certian address
function getBalanceOf(address _addr) public view returns(uint) {
return _addr.balance;
}
//Get the ether balance of this very contract
function getBalance() public view returns(uint) {
return address(this).balance;
}
//Transfer to a specific address from this contract
function transferTo(address to, uint amount) public payable {
to.transfer(amount);
emit Transfered(to,amount);
}
//Send to a specific address from this contract
function sendTo(address to, uint amount) public payable {
bool result = to.send(amount);
emit Sent(to,amount,result);
}
//Fallback function used to accept ether
function () payable public {
}
}
代碼執(zhí)行結(jié)果這里不貼出鞋真,有興趣的同學(xué)可以自行通過remix-ide做相應(yīng)實(shí)驗(yàn)。
bytesN
固定長度字節(jié)可以使用bytes1, bytes2, bytes3, …, bytes32 分別表示沃于,其中bytes1 可以使用byte代替涩咖。
Literals
Address Literals
任何十六進(jìn)制的字符串,凡是能通過地址合法性檢查(address checksum test)繁莹,就會(huì)被認(rèn)為是地址檩互,例如:
0xdCad3a6d3569DF655070DEd06cb7A1b2Ccd1D3AF
Rational and Integer Literals
整形字量可以使用十進(jìn)制整數(shù)表示,例如:50咨演,999等闸昨,solidity中不支持八進(jìn)制數(shù)據(jù)表示。solidity支持十進(jìn)制小數(shù)薄风,例如3.5饵较,99.9都是合法的有理數(shù)字面量,科學(xué)計(jì)數(shù)法也同樣支持遭赂,例如2e10循诉,2e-2,2.5e2也是合法的。
String Literals
String Literals 和多數(shù)語言類似撇他,solidity中‘’和“”都可以用于表示String Literals.
Hexadecimal Literals
Solidity 通過hex前綴表示16進(jìn)制字面量茄猫,16進(jìn)制字面量可以作為字符串使用,例如hex''4142434445"表示“ABCDE”.
下面是一個(gè)關(guān)于字面量的例子:
pragma solidity ^0.4.23;
contract LiteralTest {
event IntValue(int value);
event StringValue(string value);
function testRationalLiteral() public {
// Next line compiles even the 2**8 - 2**6 - 2**6 is 127 whitch is greater than the biggest positive number of int8
int8 x = (2**8 - 2**6 - 2**6 -1);
//Next line should get a error since the final result is greater than 127
//int8 x = (2**8 - 2**6 - 2**6);
emit IntValue(x);
}
function testHexLiteral() public {
//Value of the event is "ABCDE..."
emit StringValue(hex"414243444546474849");
}
}
Enum
Enum和java中的Enum類似困肩,可以用于定義取值范圍有限的類型划纽。Solidity 中Enum可以和整形顯式的相互轉(zhuǎn)換,整形再轉(zhuǎn)換成enum時(shí)锌畸,編譯器/EVM會(huì)檢查取值范圍阿浓,如果范圍有誤則會(huì)產(chǎn)生一個(gè)錯(cuò)誤。 下面是一個(gè)例子:
pragma solidity ^0.4.23;
contract EnumTest {
event UintValue(uint value);
event EnumValue(Status status);
enum Status {ACTIVE,SUSPENDED}
function enumTest() public {
Status s1 = Status.ACTIVE;
//0 will be emited
emit UintValue(uint(s1));
Status s2 = Status(1);
//1 will be emited
emit EnumValue(s2);
//Next line will get an compile time error for 2 is out of range
//Status s2 = Status(2);
uint x = 4 - 4;
Status s3 = Status(x);
//0 will be emited
emit EnumValue(s3);
// x = 4 - 2;
//The next line will get an run time error for x is out of range
// Status s4 = Status(x);
}
}
Function Types
函數(shù)類型也是值類型的一種蹋绽,和C語言中的函數(shù)指針類似,用于指向一個(gè)函數(shù)筋蓖,可以用于實(shí)現(xiàn)回掉等功能卸耘。函數(shù)類型的細(xì)節(jié)會(huì)在后續(xù)文章中單獨(dú)描述。