以太坊智能合约开发第五篇:字符串拼接—Solidity
以太坊智能合约开发第五篇:字符串拼接—Solidity
Marser_cn 发表于6天前
以太坊智能合约开发第五篇:字符串拼接—Solidity
  • 发表于 6天前
  • 阅读 130
  • 收藏 1
  • 点赞 0
  • 评论 1

【腾讯云】买域名送云解析+SSL证书+建站!>>>   

上一篇,我们实现了一个简单的智能合约。用户输入什么字符串,合约就原样返回什么。在文章最后抛出了一个问题:如果我们事先在合约里定义好 Hello 字符串,如何与 name 变量进行字符串拼接?

在智能合约里进行字符串的拼接可不是一件简单的事情。本篇就来介绍智能合约里的字符串拼接。

尝试

我们先用绝大部分语言都通用的连接符 +. 来尝试着修改代码:

//pragma关键字:版本申明。
//用来指示编译器将代码编译成特定版本,以免引起兼容性问题
//此处不支持0.4.0之前的编译器,也不支持0.5.0之后的编译器(条件为 ^)
pragma solidity ^0.4.0;

//contract关键字:合约申明
//和Java、PHP中的class类似
//此处是申明一个名为Hello的合约
contract Hello {

    string str="Hello ";

    //public: 函数访问属性(后续文章为详细阐述)
    //returns (string): 定义返回值类型为string
    function say(string name) public returns (string) {
        return str + name;
    }
}

<!--more-->

运行 node deploy.js 部署脚本后,抛出了一个异常:

TypeError: Operator + not compatible with types string storage ref and string memory
return str + name;

我们将其修改为 . 并尝试部署后,也抛出一个异常:

TypeError: Member "name" not found or not visible after argument-dependent lookup in string storage ref return str . name;

说明在智能合约里,***+*** 和 . 都不是连接符。 通过查阅 Solidity 官方文档,我们发现 Solidity 语言并不提供字符串连接符的语法: Solidity文档 那有没有其他方式,可以实现字符串的拼接功能呢?

以下部分为付费用户专享福利,请点击链接跳转至我的专栏付费购买。通过阅读以下部分,你将学习到:

  • 第三方字符串工具合约:字符串的扩展处理(查找、分割、比较、拼接等功能)
  • 智能合约里第三方合约的引入
  • 字符串的拼接实现

我的专栏:智能合约 智能合约开发QQ群:753778670

智能合约开发QQ群


目前有几套区块链实践的视频课程(视频+源码),需要的可加我微信(kuangwenjie)私信我(付费):

  • 『区块链』从零构建以太坊(Ethereum)智能合约到项目实战
  • 基于Ethereum & IPFS的去中心化Ebay区块链项目开发实战
  • HyperLedger(超级账本)Fabric

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
Marser_cn
粉丝 39
博文 27
码字总数 19462
评论 (1)
不由分说
Ethereum Stack Exchange 上面有回答,回答地址是:https://ethereum.stackexchange.com/questions/729/how-to-concatenate-strings-in-solidity?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

用到了这个开源的库:github.com/Arachnid/solidity-stringutils/strings.sol
import "github.com/Arachnid/solidity-stringutils/strings.sol";

contract C {
using strings for *;
string public s;

function foo(string s1, string s2) {
s = s1.toSlice().concat(s2.toSlice());
}
}

但是,如果字符串很长的话,不是要消耗很多的gas吗?
×
Marser_cn
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: