You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决Rust中原始字符串分隔符无效字符错误及Near Protocol日志宏格式与合约构建问题

解答你的Rust & Near Protocol问题

刚接触Rust和Near确实会遇到不少语法和合约规范的坑,我来帮你逐个解决这两个问题:

问题1:原始字符串分隔符错误(found invalid character; only # is allowed in raw string delimitation

这个错误是Rust原始字符串的语法规则问题——Rust的原始字符串(raw string)要求前后的分隔符只能是连续的#字符,不能混入任何其他符号。比如你可能不小心写了r!"hello"!r$"test"$这类错误格式,或者在分隔符里加了非#的字符,直接违反了语法规则。

解决方法:

  • 原始字符串的标准格式是r#"内容"#,如果你的内容里包含双引号",只需要增加#的数量,且前后数量保持一致即可。比如内容里有",就用r##"包含"双引号"的内容"##,这样里面的双引号不会被当作字符串结束符,也不需要额外转义。
  • 检查代码中所有原始字符串的写法,确保开头是r+n个#+",结尾是"+n个#,中间没有其他分隔字符。

示例:

// 错误写法:用了非#的分隔符
let wrong = r!"This has "quotes" inside"!;

// 正确写法:用##作为分隔符包裹含双引号的内容
let correct = r##"This has "quotes" inside"##;

问题2:log!宏与EVENT_JSON格式错误

这个问题出在两个核心点:HTML实体误用JSON格式规范

首先,你最初的代码里用了",这是HTML中的双引号转义符,但在Rust字符串(包括原始字符串)里完全不需要这个,直接写"就行。这种HTML转义符会让log!宏无法识别正确的格式字符串,因此抛出“Invalid format string”错误。

之后你换成单引号,虽然格式错误消失了,但JSON语法强制要求所有键和字符串值必须用双引号,单引号的JSON是不合法的,自然会在合约构建时因为不符合Near的事件规范报错。

正确写法:

用原始字符串包裹合法的JSON格式,直接使用双引号,同时保留{}作为log!宏的占位符:

log!(r#"EVENT_JSON:{"standard": "nepXXX", "version": "1.0.0", "event": "YYY", "data": {"token_id": "{}"}}"#, token_id);

这里的关键注意事项:

  1. r#"..."#原始字符串,里面的双引号无需转义,避免了普通字符串里写\"的麻烦。
  2. 严格遵循JSON规范,所有键和字符串值都用双引号,符合Near事件格式的要求。
  3. {}是log!宏的格式化占位符,会被后面的token_id值正确替换,最终生成合法的事件JSON。

如果你的token_id是数字类型,也可以把"{}"改成{}(去掉双引号),根据实际类型调整即可。

内容的提问来源于stack exchange,提问作者Віталій Казміревський БС-21м

火山引擎 最新活动