【问题标题】:How to explicitly annotate the type of an array literal如何显式注释数组文字的类型
【发布时间】:2020-07-01 12:07:02
【问题描述】:

我有这个 Rusqlite 代码:

use rusqlite::types::ToSql;

// ... normal Rusqlite initialisation code ...

let mut statement = tx.prepare("INSERT INTO table VALUES (?1, ?2)")?;
let params: &[&dyn ToSql] = &[
    &0u32,
    &"hello",
];
statement.execute(params)?;

?1 参数是 INTEGER?2 参数是 TEXT。这可以编译,但是如果我将 params 移动到函数调用中,它不会编译:

statement.execute(&[
    &0u32,
    &"hello",
])?;

这会为&hello 提供以下错误。

mismatched types
  expected type `&u32`
found reference `&&'static str`

它似乎是根据第一个元素的类型推断数组文字的类型。显式设置数组类型的语法是什么?

【问题讨论】:

  • 试试&[&0u32 as &dyn ToSql, &"hello" as &dyn ToSql] ?
  • 我认为您只需要将第一个数组元素强制为&dyn ToSql
  • 很难回答您的问题,因为它不包含minimal reproducible example。我们无法分辨代码中存在哪些 crate(及其版本)、类型、特征、字段等。如果您尝试在Rust Playground 上重现您的错误,如果可能的话,这将使我们更容易为您提供帮助,否则在全新的 Cargo 项目中,然后在edit 您的问题中包含附加信息。您可以使用Rust-specific MRE tips 来减少您在此处发布的原始代码。谢谢!
  • edit 您的问题并粘贴您所得到的准确和完整的错误——这将帮助我们了解问题所在,以便我们能够提供最好的帮助。有时试图解释错误消息很棘手,实际上错误消息的不同部分很重要。请使用直接运行编译器的消息,而不是 IDE 生成的消息,它可能会尝试为您解释错误。

标签: rust


【解决方案1】:

您可以像任何其他类型一样注释数组文字的类型,方法是将类型写在变量名之后,用冒号分隔:

let array: [u8; 5] = [1, 2, 3, 4, 5];

这不是你的问题。您的问题是您正在创建一个异构数组,其中每个元素的类型都不同。第一个元素是对整数的引用,第二个元素是字符串,等等。您需要更急切地对 trait 对象执行案例:

let x = [&42 as &dyn Display, &true];

对于 rusqlite,请使用 params! 宏为您执行此操作:

use rusqlite::params; // 0.23.1

fn main() {
    let x = params![&42, &true];
}

另见:

【讨论】:

  • 所以要清楚,没有明确的语法;它只使用第一个元素的类型。
猜你喜欢
  • 2015-04-18
  • 2011-01-22
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
相关资源
最近更新 更多