< 返回版块

sstudioer 发表于 2021-02-21 17:27

例子, 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);
}

评论区

写评论
eweca-d 2021-02-22 14:05

或许可以通过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,肯定不会让你通过。因为这样写肯定是不安全的,谁知道你拿到这个函数后会传什么类型参数?

你要真想实现你的目的,可以有两个解决思路:

  1. 直接返回 f32,让函数调用方自己转换。(推荐)
  2. 使用 FromInto 的形式来转换,就像上面那位老哥答的一样
eweca-d 2021-02-22 14:03

我也尝试过,但是有个问题是,From的麻烦之处在于,假如你想让f32转化为i32是不行的(as可以,直接截断小数部分)。但是如果你想为From生成一个impl From<f32> for i32是非法的,原因就是孤儿规则。

然后被迫的,我们需要一个新的Trait,比如MyFrom,然后又要自己写一大堆From里已经实现过的方法了。这点尤为坑爹,特别是用第三方库的struct但想重载运算符的时候。

--
👇
aariety: 首先 as 只能在基础类型中转换。具体用法可以参考 as - Rust

编译器在编译你那个函数的时候,发现你想把 f32 转换成一个未知的类型 T,肯定不会让你通过。因为这样写肯定是不安全的,谁知道你拿到这个函数后会传什么类型参数?

你要真想实现你的目的,可以有两个解决思路:

  1. 直接返回 f32,让函数调用方自己转换。(推荐)
  2. 使用 FromInto 的形式来转换,就像上面那位老哥答的一样
作者 sstudioer 2021-02-22 12:27

thanks; 按照官方标准吧;

johnmave126 2021-02-22 10:13

rust-analyzer/IntelliJ Rust了解一下 装了LSP插件以后编辑器都可以直接报错

--
👇
sstudioer: thanks;

rust的泛型还是不行; C++相同的东西,非法调用, 都不用编译器, IDE都直接报错;

--
👇
aariety

作者 sstudioer 2021-02-21 23:50

thanks;

rust的泛型还是不行; C++相同的东西,非法调用, 都不用编译器, IDE都直接报错;

--
👇
aariety

aariety 2021-02-21 23:28

首先 as 只能在基础类型中转换。具体用法可以参考 as - Rust

编译器在编译你那个函数的时候,发现你想把 f32 转换成一个未知的类型 T,肯定不会让你通过。因为这样写肯定是不安全的,谁知道你拿到这个函数后会传什么类型参数?

你要真想实现你的目的,可以有两个解决思路:

  1. 直接返回 f32,让函数调用方自己转换。(推荐)
  2. 使用 FromInto 的形式来转换,就像上面那位老哥答的一样
uno 2021-02-21 18:48
fn sum<T: From<f32>>(min: i32, max: i32) -> T {
    let result = 3.14 + min as f32 + max as f32;
    return result.into();
}

fn main() {
    let a: f64 = sum(15, 100);
    let b = sum::<f64>(15, 100);
}
1 共 7 条评论, 1 页