如何解决锈链结果组合剂
我一直在关注Rust教程,在该教程中,一个函数的两个版本据称产生相同的结果:
版本1:
pub fn get_transactions(fname:&str) -> Result<Vec<Transaction>,String> {
let s = match std::fs::read_to_string(fname){
Ok(v)=>v,Err(e)=> return Err(e.to_string()),};
let t:Vec<Transaction> = match serde_json::from_str(&s) {
Ok(v)=>v,};
Ok(t)
}
版本2:
fn get_transactions_b(fname:&str) -> Result<Vec<Transaction>,String> {
std::fs::read_to_string(fname)
.map_err(|e| e.to_string())
.and_then(|ld| serde_json::from_str(&ld) )
.map_err(|e| e.to_string())
}
但是,对于版本2,我收到以下消息:
类型不匹配
期望结构std::string::String
,找到结构serde_json::error::Error
注意:预期枚举std::result::Result<_,std::string::String>
找到枚举std::result::Result<_,serde_json::error::Error>
帮助:尝试使用预期枚举的变体:_::_serde::export::Ok(serde_json::from_str(&ld))
,
我无法做出这样的决定:
-
将鼠标悬停在VS Code中的ld闭包参数
|ld|
上,它表示类型为std::string::String
-
将鼠标悬停在
from_str(&ld)
的ld上。 -
现在我了解到
Result
由Ok
和Err
组成,但我认为组合器链接会起作用。 -
编译器建议的修复程序也不起作用。
- (或说得通):
_::_
的全部含义是什么? - 为什么
Ok
不在from_str内?
- (或说得通):
-
要使第2版正常工作,您需要做什么?
这是Result,其中包含Rust文档中combinators的方法。
Cargo.toml
[dependencies]
serde = "1.0.115"
serde_derive = "1.0.115"
serde_json = "1.0.57"
- 货物1.45.1
- rustc 1.45.2
解决方法
问题来自import discord,asyncio
discord_token = open('token.txt').read()
client = discord.Client()
@client.event
async def on_message(message):
if message.author == client.user:
return
if message.content.lower().startswith('test'):
await message.channel.send('testing,sending to channel works!')
@client.event
async def on_ready():
print('Successfully connected to',client.user)
client.run(discord_token)
电话。
调用and_then
时不允许更改错误类型。
因此,您的函数应该返回and_then
。但是,Result<Vec<Transaction>,String>
返回的错误类型是serde_json::from_str
。
您可以这样解决它:
serde_json::error::Error
请注意,对std::fs::read_to_string(fname)
.map_err(|e| e.to_string())
.and_then(|ld| serde_json::from_str(&ld).map_err(|e| e.to_string()))
的调用现在位于传递给map_err
的函数中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。