Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 什么是FromStr trait终身不暴露的原因?_Rust_Traits_Lifetime - Fatal编程技术网

Rust 什么是FromStr trait终身不暴露的原因?

Rust 什么是FromStr trait终身不暴露的原因?,rust,traits,lifetime,Rust,Traits,Lifetime,Rust FromStr性状的定义如下 pub trait FromStr{ 类型错误; fn来自_str(s:&str)->结果; } 它不命名其生存期,并且不能为包含对源字符串引用的内容实现该特性,例如: struct MyIterator{ 类型Err=i32; fn来自_str(s:&'a str)->结果{ Ok(My迭代器{cur_指针:s}) } } 出错 method `from_str` has an incompatible type for trait: expecte

Rust FromStr性状的定义如下

pub trait FromStr{
类型错误;
fn来自_str(s:&str)->结果;
}
它不命名其生存期,并且不能为包含对源字符串引用的内容实现该特性,例如:

struct MyIterator{
类型Err=i32;
fn来自_str(s:&'a str)->结果{
Ok(My迭代器{cur_指针:s})
}
}
出错

method `from_str` has an incompatible type for trait: expected bound lifetime parameter , found concrete lifetime [E0053]
到目前为止,我还没有找到为MyIterator实现FromStr的方法。我假设这是因为原始特性并没有在其参数中公开字符串的生存期。 我的第一个问题是:我没有办法为MyIterator实现FromStr,这是对的吗?如果我错了,有什么方法可以做到(假设MyIterator希望保留对原始字符串的引用)

现在我只发现了这个问题:,但最好的答案是“我不相信你能实现”,所以我想确定这在Rust 1.0.0中是不可能的

现在,如果特质定义是这样的:

trait MyFromStr结果;
}
可以为包含对原始字符串的引用而不包含对原始字符串的引用的类型实现它:

MyIterator结果的结构MyIterator{ Ok(My迭代器{cur_指针:s}) } } 结构霉菌病{ 瓦尔:字符串 } 霉菌感染的impl{ 类型Err=i32; fn来自_str(s:&'a str)->结果{ Ok(MyCopy{val:s.to_string()}) } }
我的第二个问题是:str中的trait没有暴露生命周期,这有什么特别的原因吗?也许我误解了生命周期的某些内容,而暴露生命周期也有缺点?

包括生命周期会使特征更加复杂,更具体地说,会使使用该特征的通用代码更加冗长(带来不必要的生命周期)<代码>fn foo会

它对于字符串的预期用途也是不必要的。通常,您从字符串解析并使用结果,而不必担心字符串。这样编码当然更容易。许多类型无论如何都不需要生存期(请参阅实现它的长长的类型列表)

对于此类型,无法从str实现
FromStr
。你能做的就是

impl<'a> From<&'a str> for MyIterator<'a> { ... }

impl for MyIterator为这个答案提供了很多信息!我真的很想知道,如果生命周期被暴露,trait就不能轻易地用作类型参数。