solidity新手,从别的语言转来的,对solidity的引用的理解总觉得有什么不到位的地方,很别扭,静心深究,终于有些小小的感悟。 把b赋值给变量a,如果产生了引用,即意味着,在a里,存储了一个...
solidity新手,从别的语言转来的,对solidity的引用的理解总觉得有什么不到位的地方,很别扭,静心深究,终于有些小小的感悟。 把b赋值给变量a,如果产生了引用,即意味着,在a里,存储了一个指向b的引用。也就意味着,无论修改a还是修改b,底层的那份数据都会改变。 在Rust如果加上类型标注则应该这么写:
let a:&Type=&b;
其中b的类型是Type。右边的&是个动词,表示产生一个引用。左边的&是个名词,意味着是个引用类型。最终将a绑定到这个引用类型的数据上。 但是在solidity中,写成这样:
Type a=b;
什么都看不出。这里面只有赋值一个动作,而是否会产生引用完全是隐式的,需要看a和b的类型和location修饰符。如果是值类型,则不会产生引用,一定只会产生copy,类似于Rust实现了copy trait的变量。如果是引用类型(结构体,数组,mapping),则需要注意的是引用类型它不一定会产生引用行为。因为这里的引用类型指的是可以通过多个不同的名称修改它的值,即这种类型有能力产生引用,但不一定会产生引用。到底产生不产生,需要看location。于是乎又搞来了三个location修饰符,分别为memory, storage,calldata。storage又分为直接写在合约体中修饰状态变量用的和放在函数中修饰局部变量用的。于是乎各种location之间又立下了一些复杂规则,谁向谁赋值使用copy行为,谁向谁赋值使用引用行为。同时数组也搞得万分复杂,定长storage数组,不定长storage数组,使用new产生的memory 不定长数组,完全被当成数组对待的bytes,不被推荐使用byte[],推荐使用的bytes1..bytes32数组,和byte等价的bytes1。。这时候你会发现Rust是一门多么有品位,适合拿来写合约的语言。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!