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

请问 rust 有类似 C++这种实现的吗?

  •  
  •   TimothyT · 2022-01-06 12:40:51 +08:00 · 2281 次点击
    这是一个创建于 812 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在学习 rust 中,在处理文件输入时遇到一点疑惑。 文件每一行内容类似0,1 -> 2,3,我需要把0,12,3分别读取出来保存到两个变量中,这两个变量类型是叫Point的结构体。在 C++中我可以这样做:

    Struct Point {
        int32_t x = 0;
        int32_t y = 0;
        
        std::istream &operator>>(std::istream &s, Point &p)
        {
            if (!s)
                return s;
    
            if (!(s >> p.x))
                return s;
            
            char delim = 0;
            s >> delim;
            if (delim != ',') {
                s.setstate(std::ios_base::badbit);
                return s;
        	}
            
            s >> p.y;
            return s;
        }
    
        std::ostream &operator<<(std::ostream &s, const Point &p) {
            s << p.x << "," << p.y;
            return s;
        }
    }
    

    然后在拿到一行的istream的时候就可以直接通过

    Point p;
    istream >> p;
    

    来修改结构体了。

    不知道 rust 是否有类似实现?我目前是用BufReader来把文件读进内存,然后用lines()或者read_line()来把每一行读成String,再用Split()方法分割每个数据,再把每个数据Parse::<i32>()解析成整数再修改结构体,感觉太麻烦了,

    7 条回复    2022-02-14 19:08:25 +08:00
    timpaik
        1
    timpaik  
       2022-01-06 13:22:35 +08:00 via Android
    实现一个 from trait 什么的包装一下就能有类似效果了
    cutepig
        2
    cutepig  
       2022-01-06 13:27:53 +08:00 via Android
    这个如何,不过我没用过
    https://crates.io/crates/text_io

    或者能否转一些标准格式比如 json
    sbw
        3
    sbw  
       2022-01-06 15:53:24 +08:00
    Serde ,实现一个自定义的反序列化
    zacksz
        4
    zacksz  
       2022-01-06 16:42:11 +08:00 via iPhone
    rust 有个 sscanf 的 crate 能做这个,和 C 的格式希望。
    更通用的做法应该是用 peg 再定制下词法规则
    zacksz
        5
    zacksz  
       2022-01-06 16:44:23 +08:00 via iPhone
    @zacksz 又看了下,sscanf 的格式更接近 Python
    Via8veritas
        6
    Via8veritas  
       2022-01-06 16:52:09 +08:00
    感觉 op 想问的是 rust 里面有没有运算符重载?那 1l 回答就可以解答了。
    foxmailzhang
        7
    foxmailzhang  
       2022-02-14 19:08:25 +08:00
    可以参考下。https://rust.codetea.com/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5428 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 593ms · UTC 08:49 · PVG 16:49 · LAX 01:49 · JFK 04:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.