例子, C++非常简单就实现, 为什么rust编译不通过? rust 用什么方法才能优雅的写出例子中的代码? // 注: 不用宏的情况下;
use std::io::stdin;
fn sum<T>(min:i32, max:i32)->T{
let result = 3.14 + min as f32 + max as f32;
return result as T;
}
fn main(){
let a:i32 = sum(15,100); // 错误
let b = sum::<i32>(15,100); // 错误
}
// C++ 代码
template <typename A>
A sum(int min, int max){
auto result = 3.14+ min + max;
return A(result);
}
int main(){
// c++ tpl
auto a = sum<int>(10,10);
}
1
共 7 条评论, 1 页
评论区
写评论或许可以通过macro来使std已经实现过的自动定位到From这个trait里去?对宏没有研究。
--
👇
eweca-d: 我也尝试过,但是有个问题是,
From
的麻烦之处在于,假如你想让f32
转化为i32
是不行的(as可以,直接截断小数部分)。但是如果你想为From
生成一个impl From<f32> for i32
是非法的,原因就是孤儿规则。然后被迫的,我们需要一个新的Trait,比如
MyFrom
,然后又要自己写一大堆From
里已经实现过的方法了。这点尤为坑爹,特别是用第三方库的struct但想重载运算符的时候。--
👇
aariety: 首先
as
只能在基础类型中转换。具体用法可以参考 as - Rust。编译器在编译你那个函数的时候,发现你想把
f32
转换成一个未知的类型T
,肯定不会让你通过。因为这样写肯定是不安全的,谁知道你拿到这个函数后会传什么类型参数?你要真想实现你的目的,可以有两个解决思路:
f32
,让函数调用方自己转换。(推荐)From
或Into
的形式来转换,就像上面那位老哥答的一样我也尝试过,但是有个问题是,
From
的麻烦之处在于,假如你想让f32
转化为i32
是不行的(as可以,直接截断小数部分)。但是如果你想为From
生成一个impl From<f32> for i32
是非法的,原因就是孤儿规则。然后被迫的,我们需要一个新的Trait,比如
MyFrom
,然后又要自己写一大堆From
里已经实现过的方法了。这点尤为坑爹,特别是用第三方库的struct但想重载运算符的时候。--
👇
aariety: 首先
as
只能在基础类型中转换。具体用法可以参考 as - Rust。编译器在编译你那个函数的时候,发现你想把
f32
转换成一个未知的类型T
,肯定不会让你通过。因为这样写肯定是不安全的,谁知道你拿到这个函数后会传什么类型参数?你要真想实现你的目的,可以有两个解决思路:
f32
,让函数调用方自己转换。(推荐)From
或Into
的形式来转换,就像上面那位老哥答的一样thanks; 按照官方标准吧;
rust-analyzer/IntelliJ Rust了解一下 装了LSP插件以后编辑器都可以直接报错
--
👇
sstudioer: thanks;
rust的泛型还是不行; C++相同的东西,非法调用, 都不用编译器, IDE都直接报错;
--
👇
aariety
thanks;
rust的泛型还是不行; C++相同的东西,非法调用, 都不用编译器, IDE都直接报错;
--
👇
aariety
首先
as
只能在基础类型中转换。具体用法可以参考 as - Rust。编译器在编译你那个函数的时候,发现你想把
f32
转换成一个未知的类型T
,肯定不会让你通过。因为这样写肯定是不安全的,谁知道你拿到这个函数后会传什么类型参数?你要真想实现你的目的,可以有两个解决思路:
f32
,让函数调用方自己转换。(推荐)From
或Into
的形式来转换,就像上面那位老哥答的一样