繁体   English   中英

无法创建使用文字零的泛型函数

Cannot create a generic function that uses a literal zero

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我试图编写一个与内置Range相似的Rust函数,但是我想要只返回X个数字并将其作为列表返回的东西,这就是为什么我要创建此函数的原因:extern crate num;

use num::Integer;

fn positions<T: Integer>(start: T, step: T, len: T) -> Vec<T> {
    (0..len).map(|i| start + step * i).collect()
}

fn main() {
    println!("{:?}", positions(10, 2, 10));
}

除了我遇到编译器错误:

error[E0308]: mismatched types
 --> src/main.rs:6:9
  |
6 |     (0..len).map(|i| start + step * i).collect()
  |         ^^^ expected integral variable, found type parameter
  |
  = note: expected type `{integer}`
             found type `T`
  = help: here are some functions which might fulfill your needs:
          - .div_floor(...)
          - .gcd(...)
          - .lcm(...)
          - .mod_floor(...)

error[E0308]: mismatched types
 --> src/main.rs:6:37
  |
6 |     (0..len).map(|i| start + step * i).collect()
  |                                     ^ expected type parameter, found integral variable
  |
  = note: expected type `T`
             found type `{integer}`
1 个回复

问题是0 我目前尚不清楚确切的规则,但让我们大致概括一下: 0是某些特定的整数类型,它与T可能相同也可能不同。 因此,编译器无法计算出要设定range的类型参数。

您可以使用Zero::zero解决此问题:

fn positions<T: Integer>(start: T, step: T, len: T) -> Vec<T> {
    (T::zero()..len).map(|i| start + step * i).collect()
}

这为编译器提供了足够的空间来推断range的两个参数是同一类型。 但是,这还不足以将Range用作迭代器:

error: no method named `map` found for type `std::ops::Range<T>` in the current scope
 --> src/main.rs:8:22
  |
8 |     (T::zero()..len).map(|i| start + step * i).collect()
  |                      ^^^
  |
  = note: the method `map` exists but the following trait bounds were not satisfied: `T : std::iter::Step`, `&'a T : std::ops::Add`, `std::ops::Range<T> : std::iter::Iterator`

不幸的是,从Rust 1.17开始, Step trait是不稳定的,因此,目前没有使用稳定的Rust解决此问题的好方法。

使用不稳定的Rust,您可能需要实现以下Step

#![feature(step_trait)]

extern crate num;

use num::Integer;

fn positions<T>(start: T, step: T, len: T) -> Vec<T>
    where T: Integer + std::iter::Step + Copy,
          for<'a> &'a T: std::ops::Add<Output = T>
{
    (T::zero()..len).map(|i| start + step * i).collect()
}

fn main() {
    println!("{:?}", positions(10, 2, 10));
}

需要要求可以复制(或克隆,如果愿意的话) T ,因为AddMul的实现按值消耗操作数,这意味着start + step * i只能被调用一次,除非它需要被多次调用。

2 通用函数的通用零

我有一个函数来计算序列的累积和。 虽然它看起来很通用,但是整数0使它成为非泛型的,因此我无法使用浮点序列调用该函数。 是否存在可以替换我的硬编码0的通用零,或者可能是使函数通用的不同方式。 ...

2015-01-21 09:54:08 2 550   f#/ inline
3 创建使用通用结构的函数?

我试图创建一个通用函数,我的VB .NET入门课程中的学生可以用来搜索结构的单个维数组。 我的结构和数组如下所示: 我的通用函数头看起来像: 我对该函数的调用如下所示: 我的问题是:有没有一种方法可以从函数内部引用数组中的各个结构字段? 我试图使其通用,以便学生可 ...

6 使用模板文字类型和泛型创建对象

我尝试使用新的Typescript 4.1文字类型功能创建一个Object。 但是,如果通用技术到位,一切都会破裂。 我想念的是什么? export type MyType&lt;T extends string&gt; = { propFromMyType: T; }; export typ ...

7 可以使用多个_Generic来创建字符串文字吗?

有没有办法在同一个表达式中多次使用_Generic关键字来创建单个字符串文字? 我正在寻找的是一种方法,例如生成一个传递给printf的单个格式字符串,所有转换说明符都适合于正确的类型。 在写这个答案时,我最终得到了一个相当丑陋的解决方法: 6个printf来代替1,几乎不理 ...

9 从Swift泛型函数返回文字值?

我想创建一个函数,该函数可以返回几种不同类型之一的数组,具体取决于其参数化的类型。 不同之处在于,我想将返回值指定为文字。 有没有办法做到这一点(或类似的东西?)它看起来应该像这样: 该特定代码在返回行上产生此错误:“无法将类型'[String]'的返回表达式转换为类型'[T]'” ...

10 具有函数值的对象字面量中的通用类型推断

考虑以下示例代码: 如果create方法不接受其参数,则返回类型是有效的,但是当它接受时,TypeScript 似乎不知道从哪里推断T类型。 字段的顺序似乎对这种行为没有任何影响。 有什么办法可以在当前的形式中正确地实现这一点吗? (没有明确指定T或函数的参数) ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM