我想初始化一个T类型的变量,它的最小值是T::min()。在Rust 1.40.0中不需要外部依赖是可能的吗?另一种方法是将变量设置为None,但这会在每次想要递增变量时引入None检查的开销。
T
T::min()
None
dpiehjr41#
在标准库中没有这样的特性。然而,如果你愿意为你感兴趣的类型创建适当的trait并实现它们,那么对于没有外部依赖的任意类型,有可能有一个通用的min和max概念,例如:
use core::fmt::Display; trait Min { fn min() -> Self; } trait Max { fn max() -> Self; } impl Min for u8 { fn min() -> u8 { std::u8::MIN } } impl Max for u8 { fn max() -> u8 { std::u8::MAX } } impl Min for i32 { fn min() -> i32 { std::i32::MIN } } impl Max for i32 { fn max() -> i32 { std::i32::MAX } } fn print_min_max<T: Min + Max + Display>() { println!("{} -> {}", T::min(), T::max()); } fn main() { let m: i32 = Min::min(); println!("{}", m); print_min_max::<u8>(); print_min_max::<i32>(); }
这将打印:
-2147483648 0 -> 255 -2147483648 -> 2147483647
Playground
iqjalb3h2#
现代Rust中的一个解决方案可以如下定义trait:
trait MyTrait { const MIN: Self; } impl MyTrait for u8 { const MIN: u8 = 42u8; } fn print_min<T: MyTrait + Display>() { println!("Value is {}", T::MIN); } print_min::<u8>();
nuypyhwy3#
这个问题说“没有外部依赖”,所以仅出于完整性的原因:
use num::traits::bounds::Bounded; pub fn print_min<T: Bounded + std::fmt::Display>() { println!("minimum: {}", T::min_value()); } print_min::<u8>();
(You当然可以将trait和实现复制到您自己的项目中,因为它相当琐碎。)
3条答案
按热度按时间dpiehjr41#
在标准库中没有这样的特性。
然而,如果你愿意为你感兴趣的类型创建适当的trait并实现它们,那么对于没有外部依赖的任意类型,有可能有一个通用的min和max概念,例如:
这将打印:
Playground
iqjalb3h2#
现代Rust中的一个解决方案可以如下定义trait:
Playground
nuypyhwy3#
这个问题说“没有外部依赖”,所以仅出于完整性的原因:
(You当然可以将trait和实现复制到您自己的项目中,因为它相当琐碎。)