为什么会出现这个错误?我们不能在函数括号内使用格式宏吗?

问题描述

代码

fltk::frame::Frame::new(0,300,100,format!("side item {}",i));

输出错误

the trait `std::convert::From<std::string::String>` is not implemented for `std::option::Option<&'static str>`

解决方法

format!() 产生一个 String,而 Frame::new 需要一个(可选的)&'static str,即一个在程序的整个生命周期内都存在的字符串切片。

这几乎意味着您只能使用字符串文字。所以不,你不能直接使用 format!()。似乎 FLTK 不打算以这种方式使用动态分配的字符串。

使用 Box::leak 可以解决这个问题。但请注意,它会执行它在罐头上所说的 - 它会泄漏内存,除非您在小部件销毁后通过 Box::from_raw() 回收它。

let leaked_title = &*Box::leak(format!("abc {}",1).into_boxed_str())
fltk::frame::Frame::new(0,300,100,leaked_title);
,

默认的 ::new 构造函数需要一个 Into<Option<&'static str>>,因此如果您的 &str 不是静态的,您可以使用 with_label()set_label()

fltk::frame::Frame::new(0,None).with_label(&format!("side item {}",i));

let mut my_frame = fltk::frame::Frame::new(0,None);
my_frame.set_label(&format!("side item {}",i));