锈蚀及;GTK&x2B;3.如何创建包含几个glib::Value类型元素的数组,这些元素可以强制转换为&;[&;ToValue]类型?

锈蚀及;GTK&x2B;3.如何创建包含几个glib::Value类型元素的数组,这些元素可以强制转换为&;[&;ToValue]类型?,gtk,rust,gtk3,glib,rust-gnome,Gtk,Rust,Gtk3,Glib,Rust Gnome,我正在为GTK+3(称为GTK rs或Rust gnome)使用Rust和绑定创建GUI应用程序。我想使用方法将一些数据插入gtk::ListStore(GtkListStore) 工作样本,但只有一列: 如果我有一列,我可以插入数据: let type_of_a_column = &[gtk::Type::U32]; let data_for_column_1 = (2 as u32).to_value(); let model_list_of_data = ListStore::ne

我正在为GTK+3(称为GTK rs或Rust gnome)使用Rust和绑定创建GUI应用程序。我想使用方法将一些数据插入
gtk::ListStore
GtkListStore

工作样本,但只有一列: 如果我有一列,我可以插入数据:

let type_of_a_column = &[gtk::Type::U32];
let data_for_column_1 = (2 as u32).to_value();
let model_list_of_data = ListStore::new(type_of_a_column);
model_list_of_data.insert_with_values(None, &[0 as u32], &[&data_for_column_1]);
然而,如果我有更多的列,我不知道如何移交更多的数据。 我知道它应该在内部调用 所以我可能需要一个数组或切片,但如果我执行以下操作:

希望在数组中传递两个元素,但不起作用

let type_of_a_column = &[gtk::Type::U32, gtk::Type::I64];
let data_for_column_1 = (2 as u32).to_value();
let data_for_column_2 = (4 as i64).to_value();
let array_of_data = [&data_for_column_1, &data_for_column_2];
let model_list_of_data = ListStore::new(type_of_a_column);
model_list_of_data.insert_with_values(None, &[1 as u32], &[&array_of_data]);
它在编译过程中给了我:

错误:特性绑定的
[&glib::Value;2]:glib::IsA
为 不满意[E0277]

我不知道如何克服它

不工作的MCVE 梅因 货舱
最终,你很可能会想写这样的东西:

model_list_of_data.insert_with_values(Some(0), &[0, 1], &[&2u32, &4i64]);
让我们稍微分解一下函数定义:

fn insert_with_values(&self,
                      position: Option<u32>,
                      columns: &[u32],
                      values: &[&ToValue])
                      -> TreeIter;
看一看,我们可以看到它是为原始整数类型实现的

由于
u32
i64
实现了
SetValue
,它们也实现了
ToValue
。对数字的引用也可以隐式强制为对特征的引用

进行此更改后,将显示窗口,但


你必须从这里找出GTK的奥秘

如果您的主文件是
src/main.rs
,您也不需要指定
[[bin]]]
节,这是常规位置。@Shepmaster更改为“&array\u of_data”,编译器抱怨:
预期的&[>k::ToValue],发现的&[>k::Value;2](预期的片,发现的2个元素数组)[E0308]
——更改为“&array_of_data[…]”,编译器抱怨:
预期的
&[>k::ToValue],发现的&[>k::Value](预期的特质gtk::ToValue,发现的结构
gtk::Value
)[E0308]`--更改为“&[&array_of_data[…]”,编译器抱怨:
错误:特质绑定的
[>k::Value]:std::marker::Sized`不满足[E0277]注意:
[>k::Value]
在编译时没有已知的常量大小`它已成功编译:d注意
gtk::init().expect(“未能初始化gtk”);
更短更好-它打印底层错误消息。
model_list_of_data.insert_with_values(Some(0), &[0, 1], &[&2u32, &4i64]);
fn insert_with_values(&self,
                      position: Option<u32>,
                      columns: &[u32],
                      values: &[&ToValue])
                      -> TreeIter;
impl<T> ToValue for Option<T> where T: SetValueOptional
impl<T> ToValue for T where T: SetValue + ?Sized
impl ToValue for Value