当前位置:首页 > 网购陷阱 > 正文内容

rust有哪些坑?

淘梦者2024-04-09 13:39:42网购陷阱1

F001 已经提到unsafe和借用所有权天生带来的问题。除此之外目前还遇到另外几个让人不爽的地方,大部分已有RFC提出解决方案,但前途不乐观。

1. Rust没有subtype, enum 作为首选类型建模工具又没有实现Dependent Type,最后要enum套struct,比较丑陋。

摘自rustc源码

enum TypeStructure {

Bool, // bool

Reference(Region, Mutability, Type), // &'x T, &'x mut T

Struct(DefId, &'tcx Substs), // Foo

Enum(DefId, &'tcx Substs), // Foo

BareFn(&'tcx BareFnData), // fn(..)

...

}

vs C++

typedef TypeStructure *Ty;

class TypeStructure { .. };

class Bool : public TypeStructure { .. };

class Reference : public TypeStructure { .. };

class Struct : public TypeStructure { .. };

class Enum : public TypeStructure { .. };

class BareFn : public TypeStructure { .. };

2. 常数不能作为泛型参数。所以当结构包含不定长数组时,要将这个数组类型作为一个泛型参数,或传入数组引用,破坏了封装。

let mut vector: ArrayDeque = ArrayDeque::new();

vs

let mut vector: ArrayDeque = ArrayDeque::new();

3. 不能栈上分配不定长内存。Rust中涉及闭包、trait object、环形引用的部分强制应用堆分配。在部分实时系统里不能用堆时就比较痛苦了。

4. 错误处理上偷师Haskell用Option又没学完,既没有monad 也没有 do notation。

这里举future的例子,option和result同理

Rust的Future大概是这样的。

fn main() {

let mut core = Core::new().unwrap();

let addr = "www.rust-lang.org:443".to_socket_addrs().unwrap().next().unwrap();

let socket = TcpStream::connect(&addr, &core.handle());

let cx = TlsConnector::builder().unwrap().build().unwrap();

let response = socket.and_then(|socket| {

cx.connect_async("www.rust-lang.org", socket).map_err(|e| {

io::Error::new(io::ErrorKind::Other, e)

})

}).and_then(|socket| {

tokio_core::io::write_all(socket, "

GET / HTTP/1.0rn

Host: www.rust-lang.orgrn

rn

".as_bytes())

}).and_then(|(socket, _)| {

tokio_core::io::read_to_end(socket, Vec::new())

});

let (_, data) = core.run(response).unwrap();

}

别人家Scala的Future。

val usdQuote = Future { connection.getCurrentValue(USD) }

val chfQuote = Future { connection.getCurrentValue(CHF) }

val purchase = for {

usd

chf

if isProfitable(usd, chf)

} yield connection.buy(amount, chf)

purchase onSuccess {

case _ => println("Purchased " + amount + " CHF")

}

5. 不支持闭包参数占位符,也没有部分应用函数。combinator写起来丑陋不说,还比较容易混淆。比如官方文档说,

let letter_count = ['apple', 'banana'].iter().map(|str| { str.len() }).sum();

可以改写为

let letter_count = ['apple', 'banana'].iter().map(str::len).sum();

但当你豁然贯通之际想要重写下面这段代码的时候

let at_least_10: Vec = [8, 9, 10, 11].iter().map(|x| { cmp::min(x, 10) }).collect();

发现Rust其实并没有部分应用函数。。。

let at_least_10: Vec = [8, 9, 10, 11].iter().map(cmp::min(_, 10)).collect(); // 不能编译

再看看隔壁scala的

val at_least_10 = List(8, 9, 10, 11).map(_ min 10).reduceLeft(_ + _);

6. Trait 没有字段。这个见仁见智,trait默认实现用到结构的字段时,目前的标准写法是,trait定义一个 get_xxx()方法给结构实现,不是那么的高效。我觉得这个feature还是比较重要的,不知为何不在1.0前加入。,core team 早已有人提出, 但也是一直被推迟。

7. 最后是一个生命周期设计上的问题——生命周期过早开始和过早结束,在3年前被核心成员发现并提出解决方案,但一直推迟到1.0发布直到今天还没解决。

比方说,下面这段不能编译

let vec = vec![...];

vec.remove(vec.len() - 1); // vec已被借用

原因是第二句被展开为

Vec::remove(&mut vec, vec.len() - 1); // 第一个参数传递可变借用,第二个参数时就不能再借出了

一定要写成

let vec = vec![...];

let len = vec.len();

vec.remove(len - 1);

分享给朋友:

相关文章

怎么追回网银被骗的钱?

怎么追回网银被骗的钱?

一、怎么追回网银被骗的钱?这必须向当地公安机关报案,有网监大队结合科技手段侦查取证,帮你挽回损失,靠个人是不行的二、被骗钱怎么追回?如果是网络诈骗,能追回的概率是比较低的。当然我们不能因为概率低就不报警,报警是唯一能找回钱的方法。被骗后我们...

kenzo竞争品牌有哪些?

kenzo竞争品牌有哪些?

kenzo竞争品牌有哪些? 比如Supreme美国纽约曼哈顿,是结合滑板、Hip-hop等文化并以滑板为主的美国街头服饰品牌; Stussy (斯图西)源于美国的潮流品牌,将滑板服、工作服、旧校服的设计加入到斯图西的服装设计中,形成一种有别...

网上买到翻新机怎么办? 网上买到翻新机怎么办

网上买到翻新机怎么办? 网上买到翻新机怎么办

一、网上买到翻新机怎样办?在淘宝卖到翻新机请立即跟卖家申请退款退货,流程如下:1.首先,打开淘宝网,登录自己的账号。2.登录账号后,鼠标移到淘宝首页右上角的“我的淘宝”上,选择下拉列表上的“已买到宝贝”按钮。3.进入“已买到宝贝”页面,可以...

谁可以教我在网上买东西??

谁可以教我在网上买东西??

我之前回答过类似的问题,可能帮到你:/怎么在淘宝网上购物//=======================================================网上怎样购物?/下面是我的经验之谈,希望能帮到初次网购的网友。网购程序...

ktv不退钱打什么电话投诉?

ktv不退钱打什么电话投诉?

一、ktv不退钱打什么电话投诉?你可以打当地工商银行的电话,或者打消费者投诉电话 二、如何投诉?保险退保不退钱?保险合同是受法律保护的,不止是保护客户的利益,也会保护保险公司的利益。法律规定了10天的犹豫期,这10天内可以无条件无损退保。超...

网购是骗人的吗?

网购是骗人的吗?

电视购物是真的不能信,我上次遇到一个客户,他买了两个山寨版手机(NokiaXXi),就是后面多了一个i。一共1800假如没i的话,正规的那种就要2000+一个,他还以为他赚死了,买来以后质量一直问题。我们帮他查了下,那种山寨版手机一个也才4...