V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
syaka
V2EX  ›  Rust

rust 的模块化太繁琐

  •  
  •   syaka · 2021-02-26 11:42:25 +08:00 · 4079 次点击
    这是一个创建于 1400 天前的主题,其中的信息可能已经有所发展或是发生改变。

    rust 的模块化是在太繁琐:

    1. 学习了 npm 的糟粕,每个文件当作一个模块。尤其是 xxx/mod.rs 简直了。
    2. crate 内的模块还需要在 lib.rs 声明才能使用。

    这两点导致 crate 里导出充斥着无意义的 mod.rs ,而 mod.rs 的内容全是无意义的 pub mod xxx 。

    跟 Go 的模块化比起来,rust 的模块化设计真的是糟粕。

    22 条回复    2022-12-27 12:03:44 +08:00
    Thetruechar
        1
    Thetruechar  
       2021-02-26 11:59:48 +08:00 via Android
    很喜欢这样的引战帖
    Leviathann
        2
    Leviathann  
       2021-02-26 12:08:42 +08:00 via iPhone
    反正我觉得官方书的模块化那章写的很烂
    最后一节忽然说文件夹也是 path 的一部分
    也没提 lib 和 binary 怎么交互
    试了下才知道把 lib 当成外部 package 一样用 cargo 文件夹名才能导进来
    GTim
        3
    GTim  
       2021-02-26 12:13:22 +08:00   ❤️ 1
    nnd. 所有权和所有权转让、指针、智能指针、装箱等等才是大头啊,这几个你中有我,我中有你,不来回个 50 遍根本理解不了
    HeapOverflow
        4
    HeapOverflow  
       2021-02-26 12:14:35 +08:00
    一看就是没被 c++虐过
    hunk
        6
    hunk  
       2021-02-26 12:25:52 +08:00
    花了几天时间看 rust 和 go,准备先从 go 学起。
    有个需要大并发的需求.
    palfortime
        7
    palfortime  
       2021-02-26 12:35:53 +08:00 via Android
    2018 可以不用 mod.rs 。写 mod xxx,有什么不好,这样更明确清晰。
    fakeshadow
        8
    fakeshadow  
       2021-02-26 17:30:54 +08:00
    那如果让你知道了 pub(self/super/crate) 是不是会更抓狂?
    syaka
        9
    syaka  
    OP
       2021-02-26 18:37:36 +08:00
    @palfortime 没发现一个文件作为一个 mod 有什么优点,现在的模块化语法太繁琐了。
    syaka
        10
    syaka  
    OP
       2021-02-26 18:38:35 +08:00
    @Thetruechar 非引战,实际项目中实在繁琐的不行,更理解不了为什么一个文件作为一个 mod 有什么收益。
    syaka
        11
    syaka  
    OP
       2021-02-26 18:39:14 +08:00   ❤️ 1
    @GTim 所有权是精髓,但是现在的模块化方案真的是糟粕
    syaka
        12
    syaka  
    OP
       2021-02-26 18:39:32 +08:00
    @HeapOverflow 还真是,人生苦短,我用 Golang
    syaka
        13
    syaka  
    OP
       2021-02-26 18:40:18 +08:00
    @CatCode 我已经明白了模块化是怎么回事,只是实在不理解如此繁琐的设计有什么必要
    maxat20xx
        14
    maxat20xx  
       2021-02-26 19:21:11 +08:00 via Android
    @GTim 不能同意更多…
    CatCode
        15
    CatCode  
       2021-02-26 20:05:58 +08:00
    @syaka 可能是早期的设计吧。而即使到了 2018 edition 也不便于改太狠,毕竟兼容性还是要考虑的。
    有的东西,在早期可能是当时很好的设计。但是随着技术发展,更好的设计可能会出现,然后在对比原来的设计,就发现原来的设计不是那么美好。
    Jirajine
        16
    Jirajine  
       2021-02-26 20:26:31 +08:00 via Android
    我到觉得两者没太大优劣之分。
    rust 的单文件模块,一个模块代码很多的时候文件就会太长,不得不分模块。而 go 就可以用多个文件写同一个模块。
    而 go 用目录分模块,模块很多一个模块代码很少的时候也会很麻烦,并且文件名不体现模块名。

    但是 rust 整个的包管理 crate 系统要更好,lib 的归 lib,bin 的归 bin,比 go 都混到一起更清晰。
    plko345
        17
    plko345  
       2021-02-27 08:51:18 +08:00 via Android
    喜欢 rust,但这点也同意楼主的观点
    syaka
        18
    syaka  
    OP
       2021-02-27 15:37:02 +08:00
    @Jirajine go 用一个目录作为一个模块(和 Java 一样),一般是目录名体现模块名。
    cargo 是包管理工具,这一点确实比 go modules 好。
    poly000
        19
    poly000  
       2021-04-05 07:47:22 +08:00
    感觉可以一个 lib 一个 crate 这样 cargo 支持多 crate 管理
    Nugine0
        20
    Nugine0  
       2021-04-28 11:32:32 +08:00 via Android   ❤️ 1
    你可以在一个文件内写多个模块,也可以用 include! 把多个文件合成一个模块,还可以用 #[path="xxx.rs"] 把模块指向不同名的文件。

    lib.rs 里还能一次性写完整个项目的模块树,完全不需要额外的 mod.rs

    不喜欢默认模块配置的话,有很多比较方便的方法修改行为。
    galenjiang
        21
    galenjiang  
       2022-07-20 15:51:02 +08:00
    mod.rs 和 index.js 有区别吗?
    另外,这样写的好处是,没有像 node 一样软链导致的各种问题,声明和实现分开了。
    itfanr
        22
    itfanr  
       2022-12-27 12:03:44 +08:00
    @poly000 很多项目都是 多 crate 管理的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5370 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 07:36 · PVG 15:36 · LAX 23:36 · JFK 02:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.