rust 大抵是病了,它担心大家太容易掌握了

77 天前
 5261

举个例子

闭包

fn  add_one_v1   (x: u32) -> u32 { x + 1 }
let add_one_v2 = |x: u32| -> u32 { x + 1 };
let add_one_v3 = |x|             { x + 1 };
let add_one_v4 = |x|               x + 1  ;

初看确实好理解,也能掌握,就算再加上

immutable 、mutable 、move 也能理解

但是再 加上边界 、FnOnce 、Fnmut 这些就给我整不会了,干懵逼了

impl<T> Option<T> {
    pub fn unwrap_or_else<F>(self, f: F) -> T
    where
        F: FnOnce() -> T
    {
        match self {
            Some(x) => x,
            None => f(),
        }
    }
}

我只想说 rust 是所有语言中把符号运用到极致的语言!

继续苟着看下去!

8686 次点击
所在节点    Rust
74 条回复
xtreme1
77 天前
如果只解决写起来没 Java 爽, 全程 Box<T> Rc<RefCell<T>> Arc<Mutex<T>> 又不是不行, 反正性能你大概不需要
dacapoday
77 天前
rust 的内存安全也只能适合简单的同步场景。一旦异步或 arena 等只能运行时确定生命周期的地方,代码要么晦涩难改,要么引入简易 GC ,局部 unsafe ,回退到 C++的情况。
adoal
77 天前
@FreeWong 内存安全的语言太多了,但是如果想要内存安全又想要避开 GC ,那,基于“你不能既要又要还要”的道理,总要付出更致命的牺牲才能得到
Rickkkkkkk
77 天前
这种真的易读吗...
zeuss
77 天前
语法糖尿病
InkStone
77 天前
@xtreme1 就算做了 type alias 还是挺不爽 的,因为调的时候需要手动解一次包。

等什么时候自动解包实装就真爽了。
InkStone
77 天前
@securityCoding Scala 能用自定义符号做操作符,论花里胡哨是真的没人能跟它比
xz410236056
77 天前
@jellen 别的吹吹算了,逃逸、非逃逸、自动闭包、尾随,还有缺省值的使用,swift 的关键词和用法足够单独写本书
xdeng
77 天前
go 能让我心情愉悦
OBJECTION
77 天前
一直写 c++ 这些语法 还好吧。。 我之前一个同事写代码还贼喜欢套模板。。
lucifer9
77 天前
c 艹的模版,go 的范型,zig 的指针解引用,写出来哪个是好看的
ratazzi
77 天前
你再去看看生命周期
yolee599
77 天前
学过一遍 rust ,让我觉得 C 真的太好了,线程,信号量,互斥量,链表,指针,尽情的使用,就像进了一间满屋子工具的房子,做啥都行,还能交叉编译成各种系统的库,跑在 x86 上,arm 上,risc-v 上,8051 上,通通没问题,编译出来的符号就是函数名,一看就懂,这才是大道至简😁
jellen
77 天前
@xz410236056 把 ARC ,循环引用啥的了解下,基本使用没问题,用着还行;
高阶语法连喵神都头疼,确实越来越复杂,不过貌似新版有简化初学者使用的 flag
5261
77 天前
@yolee599 是的,写代码到最后我觉得还是简单点好,至少要让人看的懂

尤其是作为 Java 开发,大部分项目都是正常的 OOP ,但是有些项目还非得 DDD 模式搞,然后再把项目集成起来,那种感觉是真的酸爽!
Greendays
77 天前
JAVA 的恩情还不完
leonshaw
77 天前
写个容器都要 unsafe ,以后会像 C++一样,分成写库的和用库的两种语言
PUR4uF5Oq0z0YN9r
77 天前
愚蠢的常规做法都是把简单问题复杂化
clino
77 天前
让 AI 解释一下,不过我不会 rust ,看得还不是很懂,楼主看看有没有帮助

```
// 这是一个 Rust 语言中 Option 类型的 unwrap_or_else 方法实现
// 它用于在 Option 为 Some 时返回其值,为 None 时执行传入的闭包并返回其结果
// 这个函数的主要用途是提供一种安全的方式来处理可能为 None 的 Option 值,同时允许在 None 情况下执行自定义逻辑

// 为泛型类型 Option<T>实现方法
impl<T> Option<T> {
// 定义公共方法 unwrap_or_else ,接受一个闭包 f 作为参数
pub fn unwrap_or_else<F>(self, f: F) -> T
where
// 约束 F 必须是一个 FnOnce 闭包,且返回类型为 T
F: FnOnce() -> T
{
// 使用 match 匹配 self (当前 Option 实例)
match self {
// 如果是 Some(x),直接返回 x
Some(x) => x,
// 如果是 None ,执行闭包 f 并返回其结果
None => f(),
}
}
}

// 使用示例:
fn main() {
let some_value: Option<i32> = Some(42);
let none_value: Option<i32> = None;

// 当 Option 为 Some 时,直接返回值
let result1 = some_value.unwrap_or_else(|| {
println!("Some case");
0
});
println!("Result1: {}", result1); // 输出: 42

// 当 Option 为 None 时,执行闭包返回默认值
let result2 = none_value.unwrap_or_else(|| {
println!("None case");
0
});
println!("Result2: {}", result2); // 输出: 0
}
```
jianyang
77 天前
想想幸好 GO 团队力排众议就是不加任何语法糖、即便不懂 GO 的,看 GO 代码也能大概知道在做什么
rust 这边就离谱了、简单的代码段还能勉强看的懂、复杂的代码一坨一坨的,另外感觉 rust 的符号键盘都快不够按了-。-

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/1100616

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX