在Rust GTK examples中,有一个名为notebook的人。它没有编译:
for i in 1..4 {
let title = format!("sheet {}", i);
let label = gtk::Label::new(Some(&title));
//let label = gtk::Label::new(Some("test1111")); # works well
notebook.create_tab(&title, label.upcast());
}
错误是:
the trait bound `std::option::Option<&str>: std::convert::From<std::option::Option<&std::string::String>>` is not satisfied
它是什么以及如何解决它?
答案 0 :(得分:6)
您似乎正在处理notebook.rs
的旧副本。在current master中,let mut notebook = Notebook::new();
for i in 1..4 {
let title = format!("sheet {}", i);
let label = gtk::Label::new(&*title);
notebook.create_tab(&title, label.upcast());
}
中的循环如下所示:
&*title
此代码编译 - 区别在于它使用String
将Option<&str>
转换为可转换为gtk-rs
的内容。
在PR#447中,Option<&str>
在接受可选字符串的函数参数中使用Into<Option<&str>>
切换为gtk::Label::new
,包括"string"
。这使得API更符合人体工程学,因为常量字符串参数可以写为Some("string")
而不是Into<Option<...>>
。但是,更改不是100%向后兼容 - Some(&string)
模式不支持传递string
且String
为拥有&*string
- 必须写{{1}或者更明确的string.as_str()
代替。