题目如下:
https://play.rust-lang.org/?gist=d3eaa1cf5a4b76669ac3149ce595adb9&version=stable&mode=debug&edition=2015
convert_and_display涉及一个在函数内部用到的匿名的生命周期,内部用到的Record<'_>的'_与函数外部无关,调用时或许应该用convert_and_display::<for<'a> Record<'a>>(vector)这样的形式,但目前rust不支持这么做
所以目前只能传一个Vec的引用,有两个解法:
https://play.rust-lang.org/?gist=cfba74e88f13a2214c681a9fa486a7ca&version=stable&mode=debug&edition=2015
https://play.rust-lang.org/?gist=b4f7e73773dd74b07b403486b2154e9d&version=stable&mode=debug&edition=2015
1
共 4 条评论, 1 页
评论区
写评论也就是说,传进去一个 Record 而不是 Record<'_> ,这样我们可以在
convert_and_display
内部实例化成Record<'a>
。你代码中的
convert_and_display_with_specific_type
能工作大概就是这个原因了。我猜想在 HKT 实现之前只能用宏。不知道有没有高手拿出一个不用 HKT 的做法……
感觉这个问题可能需要使用 HKT 才能解决……?
(吐槽一下居然用 &String 而不是 &str。)
为什么需要
convert_and_display::<for<'a> Record<'a>>(vector)这样的形式的函数, ,又没有返回值,移动vector到函数里(vector生命周期在函数作用域内),record引用vector的值,出了函数vector里面的内容被销毁,不可访问,所以应该借用(vector生命周期在函数作用域外)
'''rust #[derive(Debug)] struct Record<'a> { data: &'a str, }
impl<'a> From<&'a String> for Record<'a> { fn from(data: &'a String) -> Record<'a> { Record { data } } }
fn convert_and_display<'a>(data:&'a String){ let record = Record::from(data); println!("{:?}", record);
}
fn main() { convert_and_display(&"test".into()); }
'''