Solidity語言學習——(三)
智慧推斷:
使用var關鍵字時,第一次賦值給變數,編譯器會自動推斷變數的型別,而且推斷後不能更改這個變數的型別了,如果更改了就會出錯,還有就是不能在函式引數中使用。注意:有時候var會推斷出一個錯誤的型別。
案例:
pragma solidity ^0.4.18;
contract Var{
function vardemo() view returns(bool){
var a = true;
return a;
}
}
結果為:
solidity中var 推斷型別時,遵循就地最小的原則,也就是說,推斷uint型別時,它會預設選擇最小的。
案例:
pragma solidity ^0.4.18;
contract Var{
function vardemo() view returns(uint){
var a = 7 ;
a=256;
return a;
}
}
這樣的話,就會報錯:
之後賦值的資料在 這個型別以內就可以。。
var可以將函式賦值給一個變數
pragma solidity ^0.4.18; contract Var{ function vardemo() view returns(bool){ var a = true ; return a; } function vardemo2() view returns(bool){ var b=vardemo; return b(); } }
16進位制
16進位制字面量:比如Address型別定義的地址就是16進位制。
特點:hexencodingto...函式,以關鍵字hex開頭,後面跟一些字串,比如hex"001122"
案例:
contract Hex{
function hexdemo()view returns(string){
var a=hex"00112233";
return a;
}
}
16進位制與bytes轉換,轉換完成後也可以通過下標來取其指定的元素值。
案例:
contract Hex{ function hexdemo()view returns(string){ var a=hex"00112233"; return a; } function hexdemo1()view returns(bytes4,bytes1,bytes1){ bytes4 a=hex"00112233"; return (a,a[0],a[3]); } }
常量和變數
常量:在solidity中,並不是所有的的型別都支援常量,只有值型別與string型別支援。
string constant a ="wek";
常量定義時要注意需要宣告資料型別。
變數:
變數位置:
memory:儲存在記憶體中
storage:永久儲存在區塊鏈上
calldata:不用再程式中指定,只要是calldata中的資料,它都是隻讀的,並不持久化到區塊鏈上,一般在外部函式才會指定。
儲存位置說明:狀態變數預設儲存在storage上面,函式中的區域性變數也會儲存在storage上面,函式的引數和返回值會儲存在memory上面。
資料位置轉換:
memory ->memory 引用傳遞,會改變其源資料的值。
memory->storage 不會改變源資料的值。
storage->memory 資料拷貝 會改變源資料的值。
storage->storage 會改變源資料的值。
contract dataLocal{
uint[5] x = [1,2,3,4,5];
uint[5] y;
// 1. memory->memory
function gmemory() view public returns(uint[5]){
uint[5] memory s = x;
fmemory(s);
return s;
}
function fmemory(uint[5] y) {
y[0] = 30;
}
// 2. memory->storage
function mToS() view public returns(uint[5]) {
uint[5] memory s = x;
y = s;
y[0] = 100;
return s;
}
// 函式裡面的變數,會直接引發錯誤,因為這本身是一個非法操作
function inFunc(uint[] x) {
uint[] y;
y = x;
}
// 3. storage->storage
function St(uint[5] storage y) internal {
y[0] = 20;
}
function g() view returns(uint[5]) {
St(x);
return x;
}
// 4. storage->memory
}
列舉
特點:使用者的自定義型別,,列舉可以顯示的與整形進行轉換,顯示的轉換會在執行時檢測數值範圍,如果範圍不匹配會引發異常,列舉型別至少要有一個成員。
預設從0開始,注:不能與整型進行隱式的轉換。
enum主要描述產品是否用過(new,used)
enum ProductCondition{
New,
Used
}
案例:
該例項結合struct和enum,生成struct物件,在生成struct物件的過程中使用enum型別:
pragma solidity ^0.4.13;
contract Store{
struct Product{
ProductCondition condition;
}
enum ProductCondition{
New,
Used
}
function getProductCondition() public pure returns (ProductCondition){
Product memory product = Product(ProductCondition.Used);
return product.condition;
}
}
從這個例項可以看出,如果構建Product結構體傳入ProductCondition.Used則返回1,ProductCondition.New返回0