「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。
以太坊中Solidity行 · 大金刚境:语法详解#地址类型、定长字节数组、字符串以及智能推断
本文收录于我的专栏:细讲区块链
众所周知,以太坊开发拥有四种境界:金刚境,指玄境,天象境以及陆地神仙。今天我们继续来学习Solidity的语法来深造大金刚境界。
一、地址类型
地址类型占20个字节,也就是160位,是存储以太坊地址的数据类型。
//地址类型
address addr = 0xA507E286b9F230801A5d0BD9F3940EAE0DC22fd8;
我们可以通过msg.sender来获取当前发送者的地址。
//获取当前地址
function get_address() public returns(address){
return msg.sender;
}
下面是运行结果,我们可以看到成功获取了当前发送者的地址。
当然,我们需要注意的是,地址类型没有加减乘除这些运算,不过它可以进行比较运算。
下面是进行比较运算的例子:
//地址比较
function compare() public returns(bool){
return addr > get_address();
}
下面是比较运算的运行结果:
地址类型也有自己的一些属性:
比如balance属性,即账户余额。可以用msg.sender.balance获取发送者的账户余额。
也可以用 (payable(address(this))).balance获取接收者的账户余额。
还存在一些方法,我们这里介绍send()方法。
//send
function deopsit() payable public returns(bool){
return (payable(address(this))).send(msg.value);
}
msg.value的值需要我们在图中的VALUE处填写。
然后获取账户余额就可以看到以太币已经到账。
二、定长字节数组
定长字节数组的方式为bytes[num].这里num可以取1-32中的任一整数。
如果类型为byte,表示为bytes1.
contract TheBytes {
bytes1 a = 0x01;
bytes2 b = 0x010a;
bytes1 c = 0x02;
function compare() public view returns(bool){
return a > b;
}
function and() public view returns(bytes1){
return a & c;
}
}
根据compare函数,我们可以知道这个类型支持比较运算。
另外根据and函数,我们对a和c进行与运算,可以得到结果0x00。
三、字符串
solidity的字符串字面量和C语言不一样,它不以'\0'或其他东西结尾,它的长度就是我们可见的长度。
下面有几种针对字符串的操作,我们来了解一下吧~
- 获取字符串的长度
string name = "ReganYue";
//获取字符串的长度
function getLength() public view returns(uint){
return bytes(name).length;
}
- 获取字符串中的值
//获取字符串中的值
function getchar() public view returns(bytes1){
return bytes(name)[0];
}
- 更改字符串中的值
//更改
function changeName() public{
bytes(name)[0] = 'q';
}
- 获取字符串的值
//获取名字
function getName() view public returns(string memory){
return name;
}
四、智能推断
如果我们有时候不能迅速确定一个数据的数据类型,我们可以使用var来智能推断。在第一次赋值时,solidity编译器会自动推断我们用var定义的变量的数据类型,不过,这个var智能推断不能用于函数参数。在第一次赋值后,var定义的变量的数据类型也确定了,之后对这个变量的赋值需要在智能推断出的数据类型范围内。
这里需要注意的两点是,我们这个var能够将函数赋值给变量以及这个智能推断有时并不会智能,有时会推断出一个错误的类型。