我可以在 Rust 中使这个断言通用吗?
Can I make this assertion generic in Rust?
我试图断言其他人的箱子中的函数返回的类型足够大,如果他们将他们的代码更改为仍然可以的东西,我不想更改我的代码。
这是我正在尝试做的事情的简化版本 (playground):
const NANOSECONDS_IN_DAY:f64 = 8.64E13;
trait HasMax<T> {
fn max_value() -> T;
}
fn max_of<T:HasMax>(_: &T) -> T {
T::max_value()
}
fn main() {
let mv = max_of(&1f64);
assert!(mv > NANOSECONDS_IN_DAY, "type is too small");
}
但是我收到以下错误:
<anon>:5:13: 5:19 error: wrong number of type arguments: expected 1, found 0 [E0243]
<anon>:5 fn max_of<T:HasMax>(_: &T) -> T {
^~~~~~
尽管您正在使用的库中发生未知的未来破坏 API 更改,但试图让您的代码正常工作充其量是错误的。简短的回答是,如果你正在使用的库的 API 发生变化,你的代码最好编译失败,而不是以更微妙或难以检测的方式失败。但我可以回答为什么你的代码没有编译。
问题出在您的特征定义中,它使用了泛型。您的特征应该是 HasMax
,而不是 HasMax<T>
。
const NANOSECONDS_IN_DAY:f64 = 8.64E13;
trait HasMax {
fn max_value() -> Self;
}
fn max_of<T:HasMax>(_: &T) -> T {
T::max_value()
}
impl HasMax for f64 {
fn max_value() -> Self {
std::f64::MAX
}
}
fn main() {
let mv = max_of(&1f64);
assert!(mv > NANOSECONDS_IN_DAY, "type is too small");
}
extern crate num;
extern crate time;
#[cfg(test)]
mod tests {
use num::Bounded;
use time::{self,Tm};
#[test]
fn size_test() {
let NANOSECONDS_IN_DAY:f64 = 8.64E13;
fn max_of<T:Bounded>(_: T) -> T {
T::max_value()
}
let type_v = time::Duration::zero().num_nanoseconds().unwrap();
let mv = max_of(type_v);
assert!(mv as f64 > NANOSECONDS_IN_DAY, "type is too small");
}
}
这有效。
我试图断言其他人的箱子中的函数返回的类型足够大,如果他们将他们的代码更改为仍然可以的东西,我不想更改我的代码。
这是我正在尝试做的事情的简化版本 (playground):
const NANOSECONDS_IN_DAY:f64 = 8.64E13;
trait HasMax<T> {
fn max_value() -> T;
}
fn max_of<T:HasMax>(_: &T) -> T {
T::max_value()
}
fn main() {
let mv = max_of(&1f64);
assert!(mv > NANOSECONDS_IN_DAY, "type is too small");
}
但是我收到以下错误:
<anon>:5:13: 5:19 error: wrong number of type arguments: expected 1, found 0 [E0243]
<anon>:5 fn max_of<T:HasMax>(_: &T) -> T {
^~~~~~
尽管您正在使用的库中发生未知的未来破坏 API 更改,但试图让您的代码正常工作充其量是错误的。简短的回答是,如果你正在使用的库的 API 发生变化,你的代码最好编译失败,而不是以更微妙或难以检测的方式失败。但我可以回答为什么你的代码没有编译。
问题出在您的特征定义中,它使用了泛型。您的特征应该是 HasMax
,而不是 HasMax<T>
。
const NANOSECONDS_IN_DAY:f64 = 8.64E13;
trait HasMax {
fn max_value() -> Self;
}
fn max_of<T:HasMax>(_: &T) -> T {
T::max_value()
}
impl HasMax for f64 {
fn max_value() -> Self {
std::f64::MAX
}
}
fn main() {
let mv = max_of(&1f64);
assert!(mv > NANOSECONDS_IN_DAY, "type is too small");
}
extern crate num;
extern crate time;
#[cfg(test)]
mod tests {
use num::Bounded;
use time::{self,Tm};
#[test]
fn size_test() {
let NANOSECONDS_IN_DAY:f64 = 8.64E13;
fn max_of<T:Bounded>(_: T) -> T {
T::max_value()
}
let type_v = time::Duration::zero().num_nanoseconds().unwrap();
let mv = max_of(type_v);
assert!(mv as f64 > NANOSECONDS_IN_DAY, "type is too small");
}
}
这有效。