泛型 提供一种可能,就是将数据类型 作为参数,传递过去。
这为复用提供可能,意义非凡。
golang没有泛型,经常为人所诟病。rust作为一个非常精致的语言,提供泛型是必须的。
比较这二种语言,泛型的引入,使程序员的工作更简单了吗?还是让语言的表达能力变强大了?
一种表达是go吹派,泛型是什么东西,太麻烦,大道至简。
另一派是rust,虽然学习麻烦的语言,会多掉几根头发。不过想想我的代码,会变的简洁又功能强大,一切都是值得的。
也许你该先看一下,我未来即将发表的文章:Optine<T> 引路
rust的错误处理,用到的是Result<T, E>枚举和问号 ?。
最常用的函数的返回 类型,是Result<T, E>,这里的T,E也可以是其它任意大写字母。
enum
举例:
fn halves_if_even<'a>(i: i32) -> Result<i32, &'a str> {
// 取数值的二分之一.
if i % 2 == 0 {
Ok(i / 2)
} else {
Err("error")
}
}
这里的<'a>是个生命周期参数,先不用管它。注意到这个函数,要么返回OK,要么Err就行了。
如何处理Result<i32, &'a str>这种返回类型?先列出第一种:
fn not_use_question_mark() {
let a = 10; //把这里改成 9 就会报错.
let half = halves_if_even(a);
let half = match half {
Ok(item) => item, //匹配到这项,返回了a
Err(e) => panic!(e), //匹配到这行,程序爆掉了
};
assert_eq!(half, 5);
}
感觉这种错误处理,并不是那么 简洁的话,可以用:
fn use_question_mark<'a>() -> Result<i32, &'a str> {
// 这里必须要返回Result
let a = 10;
let half = halves_if_even(a)?; // 如果函数返回的类型不是Result,就不能用?号,切记!
assert_eq!(half, 5);
Ok(half)
}
关于问号的应用,这里有个有个原话,可以参考:
the `?` operator can only be used in a function that returns `Result` or `Option`
(or another type that implements `std::ops::Try`)
golang,连枚举都没有,更别提泛型。不过可以模拟:
package
golang的可以通过接口来模拟泛型。
看了些代码,大致感受是, go容易学习,尽量不提供复杂的概念,不过想用较少而简单的模块,堆出复杂的东西。结果就是粗粒度的,象“我的世界”游戏中的感觉。
而rust入门难,概念多而复杂,学习曲线陡峭。一旦掌握,能写出简洁又功能强大 的东西。