如何解决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);
这里的关键注意事项:
- 用
r#"..."#原始字符串,里面的双引号无需转义,避免了普通字符串里写\"的麻烦。 - 严格遵循JSON规范,所有键和字符串值都用双引号,符合Near事件格式的要求。
{}是log!宏的格式化占位符,会被后面的token_id值正确替换,最终生成合法的事件JSON。
如果你的token_id是数字类型,也可以把"{}"改成{}(去掉双引号),根据实际类型调整即可。
内容的提问来源于stack exchange,提问作者Віталій Казміревський БС-21м




