例子, 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的形式来转换,就像上面那位老哥答的一样