【问题标题】:What are the possible operators for traits in a where clause in Rust?Rust 中 where 子句中可能的特征运算符是什么?
【发布时间】:2017-10-16 21:22:18
【问题描述】:

我正在学习 Rust,并进入了关于 trait bounds 的章节。在那一章中,他们给出了一个使用+(加号)运算符的示例,用于在where 子句中枚举所有必需的特征。

Rust 中的特征还允许使用哪些其他运算符?我进行了搜索,但找不到任何有关此的文档。 Rust 是否支持“或”表示法、括号、否定?

【问题讨论】:

    标签: rust traits method-signature type-signature


    【解决方案1】:

    '或'符号

    没有。这样的事情对我来说没有意义——如果可以是 AB,代码会做什么?

    括号

    不,除非你算上 Fn(...) 和朋友中的括号,使用尖括号作为泛型 (Vec<T>) 或在切片中使用方括号 ([u8]),但这些都是类型的一部分。

    再一次,这样的请求对我来说没有意义,你为什么需要任何类型的分组?

    否定

    没有。我相信这是因为处理否定逻辑会使事情变得更加复杂。

    其他运营商

    There's the ? (question mark) bound.


    来源:我写过a parser of Rust code。虽然我可能遗漏了一些东西,但它解析了我扔给它的所有 ~37500 个 Rust 文件,所以它非常适合。

    【讨论】:

    • 比你。我认为,如果 Rust 支持可选特征,则可以将“或”运算符创建为 ?Trait1 + ?Trait2。还是不行?
    • @GeorgeShuklin Rust 支持可选特征。 ?(问号)仅适用于特定特征Sized。对于人体工程学,每个泛型类型都有一个隐含的T: Sized 绑定除非您使用?Sized 删除该默认绑定。
    • 它不可用,但它确实有意义。假设你有一个像fn print_related_stuff<A, B>(a: A, b: B){ print(a.to_string(), b.to_string()) } 这样的函数。如果您希望编译器在函数中不只允许任何 Stringable 类型,而是只允许在几种可能关系中的任何一种中相关的类型,那么像 where A:Stringable, B:Stringable, (A == B or (A: ISomething and B: ISomethingElse)) 这样的 where 子句对我来说很有意义跨度>
    • @user986730 那个具体的例子将只使用一种泛型类型来实现,这将确保两个值具有相同的类型。
    • 我还没有生锈的经验,所以不太确定。我仍然认为我今天需要or 的东西。想要拥有一个具有超级特性 BitOr 的特性。 T 可以是任何整数(u8、u32、i32 等)。可以通过在特征本身上指定特征边界来完成,但是特征可以多次实现,并且接收我的特征作为 arg 的函数将具有不必要的通用边界。由于该特征使用任何整数、位实现BitOr,或者可以在使用整数表达式实现我的特征的类型上完成(其类型 i32、i64 等将被自动推断)。续……
    猜你喜欢
    • 1970-01-01
    • 2011-06-05
    • 2018-09-17
    • 2014-12-24
    • 2011-01-10
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多