[{"data":1,"prerenderedAt":322},["ShallowReactive",2],{"tag-rust-1":3},{"title":4,"articles":5,"hot_article":107,"month_arch":170,"total":318,"cover":319},"rust - 独孤影的博客",[6,17,26,36,47,57,66,76,86,97],{"id":7,"title":8,"uri":9,"author":10,"tags":11,"created_at":14,"view_count":15,"content":16},120,"初学rust，trait的一些使用限制","rust-some-limit-for-trait","duguying",[12,13],"rust","trait","2024-06-12 16:08:51",187,"\u003Cp>rust中，trait相当于其他语言中的接口。例如json序列化，需要实现\u003Ccode class=\"inline-code\">Serialize\u003C\u002Fcode>这个trait，但是，这里存在如下三个限制：\u003C\u002Fp>\n\n\u003Col>\n\u003Cli>要实现的 trait 和类型都在当前 crate 中定义。\u003C\u002Fli>\n\u003Cli>要实现的 trait 在当前 crate 中定义，而类型在外部 crate 中定义。\u003C\u002Fli>\n\u003Cli>要实现的类型在当前 crate 中定义，而 trait 在外部 crate 中定义。\u003C\u002Fli>\n\u003C\u002Fol>\n\n\u003Cp>也就是说，你想要对一个结构体去实现某个trait，要么，这个结构体是你的（也就是在你当前crate包中），要么，这个trait是你定义的，两者至少有一个是你自己的，你才能对这个结构体实现这个指定的trait。\u003C\u002Fp>\n\n\u003Cp>如果，trait和结构体都不是你实现的，你将无法为这个外部结构体实现外部trait。例如，我想为TcpStream实现Serialize，直接写，会报错\u003C\u002Fp>\n\n\u003Cp>\u003Cimg src=\"https:\u002F\u002Fimage.duguying.net\u002F2024\u002F06\u002Fsfgdut7l.webp\" alt=\"sfgdut7l\" \u002F>\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#f85149\">`\u003C\u002Fspan>mio::net::TcpStream\u003Cspan style=\"color:#f85149\">`\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>is\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>not\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>defined\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">in\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>the\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>current\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>craterustcE0117\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>main.rs(\u003Cspan style=\"color:#a5d6ff\">24\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">1\u003C\u002Fspan>): \u003Cspan style=\"color:#f0883e;font-weight:bold\">original\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>diagnostic\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>只能通过包裹TcpStream来实现了，总之，为外部结构体实现外部trait就是行不通。\u003C\u002Fp>\n",{"id":18,"title":19,"uri":20,"author":10,"tags":21,"created_at":23,"view_count":24,"content":25},119,"初学rust，rust数字类型转换不安全","rust-integer-type-force-cast-not-safe",[12,22],"类型转换","2024-05-28 15:04:09",250,"\u003Cp>数字类型转换是所有语言中存在的一项操作。比如golang的float64转float32，用\u003Ccode class=\"inline-code\">float32(v64)\u003C\u002Fcode>即可实现，但是这个转换在\u003Ccode class=\"inline-code\">v64\u003C\u002Fcode>的值只要不超过float32的上限，就可以安全转换。但是，这在rust中似乎行不通。\u003C\u002Fp>\n\n\u003Cp>我在一个实践程序里在结构体中定义了一系列的f32,i32字段，然后用\u003Ccode class=\"inline-code\">parse::&lt;f32&gt;()\u003C\u002Fcode>从字符串解析出f32，这一切都正常，我单独单测代码打印过这个结果，正确的读取了数字；但是当我将其进行了一系列的累加之后，转为f64再json序列化，发现居然变成了null，然后我debug打印发现，数字变成\u003Ccode class=\"inline-code\">inf\u003C\u002Fcode>了，也就是\u003Ccode class=\"inline-code\">f64::INFINITY\u003C\u002Fcode>，我类型转换过程中用的就是\u003Ccode class=\"inline-code\">as f64\u003C\u002Fcode>。\u003C\u002Fp>\n\n\u003Cp>后来我索性将定义的f32改为了f64，最后它又正常了。这说明\u003Ccode class=\"inline-code\">as\u003C\u002Fcode>操作并没有想象中那么安全。\u003C\u002Fp>\n",{"id":27,"title":28,"uri":29,"author":10,"tags":30,"created_at":33,"view_count":34,"content":35},118,"初学rust，多线程中读写全局变量","read-and-write-global-var-in-multi-thread-for-rust",[31,32,12],"全局变量","读写","2024-04-25 22:51:33",286,"\u003Cp>参考上一篇\u003Ca href=\"https:\u002F\u002Fwww.duguying.net\u002Farticle\u002Frust-how-to-set-and-get-global-variable-in-runtime\">《初学rust，如何实现在运行时对全局变量设置和读取》\u003C\u002Fa>，文章中说，可以用\u003Ccode class=\"inline-code\">OnceCell\u003C\u002Fcode>来定义全局变量，然后就可以对全局变量进行读写，实际上，我发现\u003Ccode class=\"inline-code\">OnceCell\u003C\u002Fcode>的\u003Ccode class=\"inline-code\">set()\u003C\u002Fcode>方法只能调用一次，如果你试图第二次调用\u003Ccode class=\"inline-code\">set()\u003C\u002Fcode>来修改已经设定好的值，将会报错，设置值就失败了。\u003C\u002Fp>\n\n\u003Cp>由于这一切都是为了读写的并发安全。所以\u003Ccode class=\"inline-code\">OnceCell\u003C\u002Fcode>是无法实现读写全局变量的。要实现读写全局变量，应该使用\u003Ccode class=\"inline-code\">RwLock\u003C\u002Fcode>。如下\u003C\u002Fp>\n\n\u003Cp>定义全局变量\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">static\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79c0ff;font-weight:bold\">WORKER_PID\u003C\u002Fspan>: \u003Cspan style=\"color:#f0883e;font-weight:bold\">RwLock\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>Option\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">u32\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>RwLock::new(None);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>读写全局变量\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F 写入\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">store_worker_pid\u003C\u002Fspan>(pid: \u003Cspan style=\"color:#ff7b72\">u32\u003C\u002Fspan>)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>data\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79c0ff;font-weight:bold\">WORKER_PID\u003C\u002Fspan>.write().unwrap();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">*\u003C\u002Fspan>data\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Some(pid);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F 读取\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>data\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79c0ff;font-weight:bold\">WORKER_PID\u003C\u002Fspan>.read().unwrap();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>cpid\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>data.unwrap();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>这里的读写就可以多次进行了。可以看到，这里使用了读写锁，写的时候会先通过\u003Ccode class=\"inline-code\">write()\u003C\u002Fcode>方法获取写入锁实例，然后对其赋值写入。读取的时候会先通过\u003Ccode class=\"inline-code\">read()\u003C\u002Fcode>方法获取读取锁实例，然后取里面的值。这样一来就实现了全局变量的读写。\u003C\u002Fp>\n",{"id":37,"title":38,"uri":39,"author":10,"tags":40,"created_at":44,"view_count":45,"content":46},115,"初学rust，不允许遍历过程中修改HashMap","in-rust-its-not-allow-to-modify-content-of-hashmap-while-iter-it",[12,41,42,43],"HashMap","遍历","修改","2023-12-28 21:07:42",241,"\u003Cp>先看一段代码\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">test\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">test_hash_map\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>mp: \u003Cspan style=\"color:#f0883e;font-weight:bold\">HashMap\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">str\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">str\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>HashMap::new();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>mp.keys().clone();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>k\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">in\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k2\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k3\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k2\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k3\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>看，它报错\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>error[E0502]: cannot borrow `mp` as mutable because it is also borrowed as immutable\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>   --&gt; src\u002Fprocess.rs:153:9\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>151 |     let x = mp.keys().clone();\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    |             -- immutable borrow occurs here\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>152 |     for k in x {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    |              - immutable borrow later used here\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>153 |         mp.insert(&#34;k2&#34;, &#34;v1&#34;);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    |         ^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>报错告诉我们，不允许将\u003Ccode class=\"inline-code\">mp\u003C\u002Fcode>作为mutable，因为它已经用于immutable了。难道，HashMap插入数据完毕，开始读取数据之后，不能再次插入数据了？我一开始这么怀疑，不应该啊，于是代码改成这样\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">test\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">test_hash_map\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>mp: \u003Cspan style=\"color:#f0883e;font-weight:bold\">HashMap\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">str\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">str\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>HashMap::new();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.keys().clone();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k2\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k3\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>正常了，没报错了。看样子问题出在这个\u003Ccode class=\"inline-code\">for ..in..\u003C\u002Fcode>中。仔细分析代码，我在for中遍历了它的key，或者说我正在将这个HashMap中的数据拿出来，这时候，我在for中尝试往这个HashMap中写入数据，写入数据会让这个HashMap发生变更，这里第一感让我觉得可能有问题。比如我HashMap中有10个元素，我在遍历它，然后在for中间插入新元素，那么是不是有下列问题：1，我的HashMap会不会越遍历越多，会不会永远无法遍历完；2，HashMap是无序的，我将新元素插入HashMap中，会不会导致我已经遍历过的数据由于插入新数据，导致再次被读取出来，因为它可能位置发生变化了嘛。\u003C\u002Fp>\n\n\u003Cp>其实这就是数据竞争和它带来的不确定性问题，rust作为一个内存安全第一的编程语言，编译器会教你做人。\u003C\u002Fp>\n\n\u003Cp>于是，我再改\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">test\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">test_hash_map\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>mp: \u003Cspan style=\"color:#f0883e;font-weight:bold\">HashMap\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">str\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">str\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>HashMap::new();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x: Vec\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">str\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>mp.keys().map(\u003Cspan style=\"color:#ff7b72;font-weight:bold\">|\u003C\u002Fspan>k\u003Cspan style=\"color:#ff7b72;font-weight:bold\">|\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">*\u003C\u002Fspan>k).collect();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>k\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">in\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k2\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k3\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k2\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>mp.insert(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">k3\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v1\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>这回正常了。可以看到我的操作\u003Ccode class=\"inline-code\">let x: Vec&lt;&amp;str&gt; = mp.keys().map(|k| *k).collect();\u003C\u002Fcode>是将keys()拿到的\u003Ccode class=\"inline-code\">Keys\u003C\u002Fcode>迭代器（仍旧从前面的HashMap里迭代）通过\u003Ccode class=\"inline-code\">.collect()\u003C\u002Fcode>方法将迭代器里的元素“倒”入到\u003Ccode class=\"inline-code\">Vec&lt;&amp;str&gt;\u003C\u002Fcode>，这样这个\u003Ccode class=\"inline-code\">Vec\u003C\u002Fcode>就是一个独立与HashMap内存空间之外的变量，再基于这个Vec进行遍历，就可以避免“边遍历边修改的”的情况了。\u003C\u002Fp>\n\n\u003Cp>那么大家可以思考一下，其他语言，比如golang，遇到这种情况是怎么处理的呢。\u003C\u002Fp>\n",{"id":48,"title":49,"uri":50,"author":10,"tags":51,"created_at":54,"view_count":55,"content":56},114,"初学rust，踩坑私有依赖","private-dependencies-in-rust",[12,52,53],"依赖","git","2023-12-27 22:28:21",431,"\u003Cp>最近尝试在一个项目中引用一个私有crate，这个crate是一个lib，然后存储在私有git仓库中，并且这个git平台不支持rust的crate-index.\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>第一坑，引用git依赖\u003C\u002Fstrong>\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>于是我在我的项目中这样引用外部依赖包\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>[package]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>name = \u003Cspan style=\"color:#a5d6ff\">&#34;las&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>version = \u003Cspan style=\"color:#a5d6ff\">&#34;0.1.1&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>authors = [\u003Cspan style=\"color:#a5d6ff\">&#34;....&#34;\u003C\u002Fspan>]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>edition = \u003Cspan style=\"color:#a5d6ff\">&#34;2018&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>[dependencies]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>elasticsearch = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;8.5.0-alpha.1&#34;\u003C\u002Fspan>, default-features = \u003Cspan style=\"color:#79c0ff\">false\u003C\u002Fspan>, features = [\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#a5d6ff\">&#34;rustls-tls&#34;\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>] }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>logwatcher = \u003Cspan style=\"color:#a5d6ff\">&#34;0.1.1&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>json = \u003Cspan style=\"color:#a5d6ff\">&#34;*&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>reqwest = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;0.11.12&#34;\u003C\u002Fspan>, default-features = \u003Cspan style=\"color:#79c0ff\">false\u003C\u002Fspan>, features = [\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#a5d6ff\">&#34;blocking&#34;\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#a5d6ff\">&#34;rustls-tls&#34;\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>] }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>toml = \u003Cspan style=\"color:#a5d6ff\">&#34;0.8.6&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>serde_derive = \u003Cspan style=\"color:#a5d6ff\">&#34;1.0.177&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>serde = \u003Cspan style=\"color:#a5d6ff\">&#34;1.0.177&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>serde_json = \u003Cspan style=\"color:#a5d6ff\">&#34;1.0.104&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>once_cell = \u003Cspan style=\"color:#a5d6ff\">&#34;1.18.0&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>futures = \u003Cspan style=\"color:#a5d6ff\">&#34;0.3&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>tokio = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;*&#34;\u003C\u002Fspan>, features = [\u003Cspan style=\"color:#a5d6ff\">&#34;full&#34;\u003C\u002Fspan>] }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>uuid = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;1.4&#34;\u003C\u002Fspan>, features = [\u003Cspan style=\"color:#a5d6ff\">&#34;v4&#34;\u003C\u002Fspan>, \u003Cspan style=\"color:#a5d6ff\">&#34;fast-rng&#34;\u003C\u002Fspan>, \u003Cspan style=\"color:#a5d6ff\">&#34;macro-diagnostics&#34;\u003C\u002Fspan>] }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>chrono = \u003Cspan style=\"color:#a5d6ff\">&#34;0.4&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>core_affinity = \u003Cspan style=\"color:#a5d6ff\">&#34;0.8.0&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>geoip = { git = \u003Cspan style=\"color:#a5d6ff\">&#34;ssh:\u002F\u002Fgit@git.xxxx.com\u002Fxxxx\u002Ftgeoip.git&#34;\u003C\u002Fspan>, branch = \u003Cspan style=\"color:#a5d6ff\">&#34;master&#34;\u003C\u002Fspan>, package = \u003Cspan style=\"color:#a5d6ff\">&#34;geoip&#34;\u003C\u002Fspan> }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>nix = \u003Cspan style=\"color:#a5d6ff\">&#34;0.26&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>libc = \u003Cspan style=\"color:#a5d6ff\">&#34;0.2.146&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>clap = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;4.4.2&#34;\u003C\u002Fspan>, features = [\u003Cspan style=\"color:#a5d6ff\">&#34;derive&#34;\u003C\u002Fspan>] }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>log4rs = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;1.2.0&#34;\u003C\u002Fspan> }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>log = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;0.4.20&#34;\u003C\u002Fspan> }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>[build-dependencies]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>regex = \u003Cspan style=\"color:#a5d6ff\">&#34;1.6.0&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>需要注意的是，我\u003Ccode class=\"inline-code\">git@git.xxxx.com:xxxx\u002Ftgeoip.git\u003C\u002Fcode>仓库中是一个workspace，里面有2个子项，一个是可执行bin项目，叫做\u003Ccode class=\"inline-code\">regen\u003C\u002Fcode>，一个是外部可依赖包，叫做\u003Ccode class=\"inline-code\">geoip\u003C\u002Fcode>（后续实践表明同一个workspace里面的子项引用就应该这么干，git路径是同一个，使用package指定子项的包名），我这样引入之后，发现死活拉取不了私有git依赖。报错没权限拉取，git鉴权失败\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>error: failed to get `geoip` as a dependency of package `las v0.1.1 (\u002Fdata\u002Fcode\u002Frust\u002Flas)`\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>Caused by:\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  failed to load source for dependency `geoip`\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>Caused by:\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  Unable to update ssh:\u002F\u002Fgit@git.xxxx.com\u002Fxxxx\u002Ftgeoip.git?branch=master#e41c5279\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>Caused by:\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  failed to clone into: \u002Froot\u002F.cargo\u002Fgit\u002Fdb\u002Ftgeoip-9094aceea5940357\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>Caused by:\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  failed to authenticate when downloading repository\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  * attempted ssh-agent authentication, but no usernames succeeded: `git`\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  if the git CLI succeeds then `net.git-fetch-with-cli` may help here\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  https:\u002F\u002Fdoc.rust-lang.org\u002Fcargo\u002Freference\u002Fconfig.html#netgit-fetch-with-cli\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>Caused by:\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  no authentication methods succeeded\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>各方查询后，都是建议添加\u003Ca href=\"https:\u002F\u002Fdoc.rust-lang.org\u002Fcargo\u002Freference\u002Fconfig.html#netgit-fetch-with-cli\">这个\u003C\u002Fa>选项，我开始还没搞清楚加在哪儿，但是发现使用环境变量好使。各方尝试后：\u003C\u002Fp>\n\n\u003Cp>添加到\u003Ccode class=\"inline-code\">~\u002F.cargo\u002Fconfig\u003C\u002Fcode>文件中，如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>[net]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>git-fetch-with-cli = \u003Cspan style=\"color:#79c0ff\">true\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>然后再次执行\u003Ccode class=\"inline-code\">cargo build\u003C\u002Fcode>无需环境变量即可。（前提是你本地已经配置好了访问\u003Ccode class=\"inline-code\">ssh:\u002F\u002Fgit@git.xxxx.com\u002Fxxxx\u002Ftgeoip.git\u003C\u002Fcode>的ssh key）\u003C\u002Fp>\n\n\u003Cul>\n\u003Cli>\u003Cstrong>第二坑，外部依赖包要申明为\u003Ccode class=\"inline-code\">rlib\u003C\u002Fcode>\u003C\u002Fstrong>\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Cp>我在这个bin项目中引用\u003Ccode class=\"inline-code\">geoip\u003C\u002Fcode>，发现一直报错\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>failed to resolve: use of undeclared crate or module `geoip`\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>百思不得其解，最后发现是我依赖包申明类型的问题，我\u003Ccode class=\"inline-code\">Cargo.toml\u003C\u002Fcode>申明的是\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>[package]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>....\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>[lib]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>name = \u003Cspan style=\"color:#a5d6ff\">&#34;geoip&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>crate-type = [\u003Cspan style=\"color:#a5d6ff\">&#34;staticlib&#34;\u003C\u002Fspan>, \u003Cspan style=\"color:#a5d6ff\">&#34;cdylib&#34;\u003C\u002Fspan>]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>[dependencies]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>bincode = \u003Cspan style=\"color:#a5d6ff\">&#34;1.3.3&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>serde = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;1.0.193&#34;\u003C\u002Fspan>, features = [\u003Cspan style=\"color:#a5d6ff\">&#34;derive&#34;\u003C\u002Fspan>] }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>实际\u003Ccode class=\"inline-code\">lib\u003C\u002Fcode>应该申明\u003Ccode class=\"inline-code\">rlib\u003C\u002Fcode>类型，才能被正常引用，改为如下，更新依赖，就没报错了\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>[package]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>....\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>[lib]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>name = \u003Cspan style=\"color:#a5d6ff\">&#34;geoip&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>crate-type = [\u003Cspan style=\"color:#a5d6ff\">&#34;staticlib&#34;\u003C\u002Fspan>, \u003Cspan style=\"color:#a5d6ff\">&#34;cdylib&#34;\u003C\u002Fspan>, \u003Cspan style=\"color:#a5d6ff\">&#34;rlib&#34;\u003C\u002Fspan>]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>[dependencies]\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>bincode = \u003Cspan style=\"color:#a5d6ff\">&#34;1.3.3&#34;\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>serde = { version = \u003Cspan style=\"color:#a5d6ff\">&#34;1.0.193&#34;\u003C\u002Fspan>, features = [\u003Cspan style=\"color:#a5d6ff\">&#34;derive&#34;\u003C\u002Fspan>] }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n",{"id":58,"title":59,"uri":60,"author":10,"tags":61,"created_at":63,"view_count":64,"content":65},112,"初学rust，错误处理","rust-beginners-guide-error-handle",[62,12],"错误处理","2023-12-14 14:55:54",172,"\u003Cp>rust中如何比较优雅的进行错误处理，这是一直以来困扰我的一个问题。最近写了一个ip地址库查询包，于是在其中实践了一下自定义错误、错误抛出等处理。\u003C\u002Fp>\n\n\u003Cp>rust中，如果一个函数需要返回错误，那么应该用\u003Ccode class=\"inline-code\">Result\u003C\u002Fcode>包裹返回值，\u003Ccode class=\"inline-code\">Result\u003C\u002Fcode>定义如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">enum\u003C\u002Fspan> Result\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>T,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>E\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Ok(T),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Err(E),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>通常，\u003Ccode class=\"inline-code\">Result\u003C\u002Fcode>中的第二个参数就是错误。比如\u003Ccode class=\"inline-code\">Result&lt;String, String&gt;\u003C\u002Fcode>，那么它的错误就是一个String类型的值，如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F 返回了正常值hi\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">find\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; Result\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>String,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>String\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Ok(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">hi\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>.to_string())\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F 返回了错误信息error\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">find\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; Result\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>String,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>String\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Err(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">error\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>.to_string())\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>那么有另外一个问题，就是，我们如何处理其他库或者第三方函数抛出给我们的错误呢？我们可以用\u003Ccode class=\"inline-code\">expect()\u003C\u002Fcode>,\u003Ccode class=\"inline-code\">unwrap()\u003C\u002Fcode>来解决可以解决的错误，但是有时候我们不希望处理错误，希望能够将错误抛出给上层，让上层调用者去处理。这时候，我们应该怎么定义错误类型？你当然可以在你的函数中进行错误处理之后，抛出\u003Ccode class=\"inline-code\">String\u003C\u002Fcode>类型的错误，以便继续使用\u003Ccode class=\"inline-code\">String\u003C\u002Fcode>类型作为错误类型。\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">test\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">test_find\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>foo();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>println!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{:?}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x.unwrap())\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">foo\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; Result\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>File,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>String\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>bar();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">match\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>Err(e)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Err(e.to_string()),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>Ok(f)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Ok(f),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">..\u003C\u002Fspan>.\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">bar\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; Result\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>File,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>io::Error\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>File::open(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">regions.txt\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>)\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>你可以看到，我在\u003Ccode class=\"inline-code\">foo()\u003C\u002Fcode>中调用\u003Ccode class=\"inline-code\">bar()\u003C\u002Fcode>，\u003Ccode class=\"inline-code\">bar()\u003C\u002Fcode>中返回了一个包含\u003Ccode class=\"inline-code\">io::Error\u003C\u002Fcode>的错误，而我的\u003Ccode class=\"inline-code\">foo()\u003C\u002Fcode>中要求返回的是\u003Ccode class=\"inline-code\">String\u003C\u002Fcode>，我在\u003Ccode class=\"inline-code\">foo\u003C\u002Fcode>中用\u003Ccode class=\"inline-code\">match\u003C\u002Fcode>处理了错误的情况，并且\u003Ccode class=\"inline-code\">foo\u003C\u002Fcode>中可能调用其他第三方库函数，返回的错误类型不尽相同，我每种错误类型都可以使用\u003Ccode class=\"inline-code\">match\u003C\u002Fcode>解开，然后返回\u003Ccode class=\"inline-code\">String\u003C\u002Fcode>类型的错误。但是这样处理起来，代码看起来就非常乱，到处都是\u003Ccode class=\"inline-code\">match\u003C\u002Fcode>错误。\u003C\u002Fp>\n\n\u003Cp>其实我们有另一种方法，可以自己定义一个\u003Ccode class=\"inline-code\">Error\u003C\u002Fcode>类型，然后对\u003Ccode class=\"inline-code\">Error\u003C\u002Fcode>类型进行扩展，让它兼容其他类型，如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>std::{fmt,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>io};\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">derive(Debug)\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">enum\u003C\u002Fspan> \u003Cspan style=\"color:#f0883e;font-weight:bold\">Error\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>ParseError,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>ReadError,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>InvalidIPError,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">impl\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>std::error::Error\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Error\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">impl\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>fmt::Display\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Error\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">fmt\u003C\u002Fspan>(\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>self,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>f: \u003Cspan style=\"color:#79c0ff\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#f0883e;font-weight:bold\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>fmt::Formatter)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; \u003Cspan style=\"color:#f0883e;font-weight:bold\">fmt\u003C\u002Fspan>::Result\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">match\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>self\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>Error::ParseError\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>write!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(f,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">Parse Error\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>Error::ReadError\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>write!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(f,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">Read Error\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>Error::InvalidIPError\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>write!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(f,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">Invalid IP Error\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">impl\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>From\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>io::Error\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Error\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">from\u003C\u002Fspan>(_: \u003Cspan style=\"color:#f0883e;font-weight:bold\">io\u003C\u002Fspan>::Error)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; \u003Cspan style=\"color:#f0883e;font-weight:bold\">Self\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>Error::ReadError\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">impl\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>From\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>bincode::Error\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Error\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">from\u003C\u002Fspan>(_: \u003Cspan style=\"color:#f0883e;font-weight:bold\">bincode\u003C\u002Fspan>::Error)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; \u003Cspan style=\"color:#f0883e;font-weight:bold\">Self\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>Error::ParseError\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">impl\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>From\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>std::net::AddrParseError\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Error\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">from\u003C\u002Fspan>(_: \u003Cspan style=\"color:#f0883e;font-weight:bold\">std\u003C\u002Fspan>::net::AddrParseError)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; \u003Cspan style=\"color:#f0883e;font-weight:bold\">Self\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>Error::InvalidIPError\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>我们的\u003Ccode class=\"inline-code\">Error\u003C\u002Fcode>类型，实现了\u003Ccode class=\"inline-code\">fmt::Display\u003C\u002Fcode>，让它能够处理我的包项目中可能出现的第三方错误，并且针对这些错误实现了各自的\u003Ccode class=\"inline-code\">From&lt;T&gt;\u003C\u002Fcode>的\u003Ccode class=\"inline-code\">from\u003C\u002Fcode>方法，这样，这些第三方错误就可以直接以我的\u003Ccode class=\"inline-code\">Error\u003C\u002Fcode>返回，使用?简写之后，代码就改成这样了\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">test\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">test_find\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>foo();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>println!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{:?}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x.unwrap())\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">foo\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; Result\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>File,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Error\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>bar()\u003Cspan style=\"color:#ff7b72;font-weight:bold\">?\u003C\u002Fspan>;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Ok(x)\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">bar\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; Result\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>File,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>io::Error\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>File::open(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">regions.txt\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>)\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>对比可以看到，我在foo中处理bar抛出的错误变得简单了，直接一个问号就将可能得错误抛出到\u003Ccode class=\"inline-code\">Error\u003C\u002Fcode>了，然后再将\u003Ccode class=\"inline-code\">Ok(x)\u003C\u002Fcode>返回。这样一来，错误的抛出和处理就变得优雅多了。\u003C\u002Fp>\n",{"id":67,"title":68,"uri":69,"author":10,"tags":70,"created_at":73,"view_count":74,"content":75},105,"初学rust，没有途径修改argv[0]","can-not-modify-argv0-in-rust",[71,12,72],"argv0","进程标题","2023-07-30 15:51:54",255,"\u003Cp>我们知道在C语言程序中，可以通过修改\u003Ccode class=\"inline-code\">argv[0]\u003C\u002Fcode>的值，来实现改变一个进程在\u003Ccode class=\"inline-code\">ps\u003C\u002Fcode>命令中显示的标题，先给一个C语言的demo如下：\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">include\u003C\u002Fspan> \u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">&lt;stdio.h&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">include\u003C\u002Fspan> \u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">&lt;string.h&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">\u003C\u002Fspan>  \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">extern\u003C\u002Fspan> \u003Cspan style=\"color:#ff7b72\">char\u003C\u002Fspan> \u003Cspan style=\"color:#ff7b72;font-weight:bold\">*\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">*\u003C\u002Fspan>environ;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">int\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">main\u003C\u002Fspan>(\u003Cspan style=\"color:#ff7b72\">int\u003C\u002Fspan> argc , \u003Cspan style=\"color:#ff7b72\">char\u003C\u002Fspan> \u003Cspan style=\"color:#ff7b72;font-weight:bold\">*\u003C\u002Fspan>argv[]) {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">int\u003C\u002Fspan> i;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">printf\u003C\u002Fspan>(\u003Cspan style=\"color:#79c0ff\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">argc:%d\u003C\u002Fspan>\u003Cspan style=\"color:#79c0ff\">\\n\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan> , argc);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan> (i \u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>; i \u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan> argc; i\u003Cspan style=\"color:#ff7b72;font-weight:bold\">+\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">+\u003C\u002Fspan>) {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">printf\u003C\u002Fspan>(\u003Cspan style=\"color:#79c0ff\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">argv[%d]:%s\u003C\u002Fspan>\u003Cspan style=\"color:#79c0ff\">\\t\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">0x%x\u003C\u002Fspan>\u003Cspan style=\"color:#79c0ff\">\\n\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan> , i , argv[i], argv[i]);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>  \n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan> (i \u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>; i \u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan> argc \u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan> environ[i]; i\u003Cspan style=\"color:#ff7b72;font-weight:bold\">+\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">+\u003C\u002Fspan>) {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">printf\u003C\u002Fspan>(\u003Cspan style=\"color:#79c0ff\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">evriron[%d]:%s\u003C\u002Fspan>\u003Cspan style=\"color:#79c0ff\">\\t\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">0x%x\u003C\u002Fspan>\u003Cspan style=\"color:#79c0ff\">\\n\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan> , i , environ[i], environ[i]);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">strcpy\u003C\u002Fspan>(argv[\u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>], \u003Cspan style=\"color:#79c0ff\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">nginx: process is shuting down\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">sleep\u003C\u002Fspan>(\u003Cspan style=\"color:#a5d6ff\">1000\u003C\u002Fspan>);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#ff7b72\">return\u003C\u002Fspan> \u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>}\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>进程原本的名称是\u003Ccode class=\"inline-code\">demo\u003C\u002Fcode>，但是我们通过\u003Ccode class=\"inline-code\">strcpy\u003C\u002Fcode>修改了\u003Ccode class=\"inline-code\">argv[0]\u003C\u002Fcode>之后，\u003Ccode class=\"inline-code\">ps\u003C\u002Fcode>命令显示进程的名称变为我们指定的\u003Ccode class=\"inline-code\">nginx: process is shuting down\u003C\u002Fcode>，如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>➜  build git:(master) ✗ ps -ef | grep nginx\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>root     1263942 1252322  0 15:29 pts\u002F2    00:00:00 nginx: process is shuting down\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>root     1263973 1253542  0 15:29 pts\u002F3    00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox nginx\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>这也是nginx程序实现在修改进程标题为\u003Ccode class=\"inline-code\">nginx: master\u003C\u002Fcode>, \u003Ccode class=\"inline-code\">nginx: worker\u003C\u002Fcode> 以及 \u003Ccode class=\"inline-code\">nginx: process is shuting down\u003C\u002Fcode> 的原理，从而实现在ps的标题中标识不同类别的进程。\u003C\u002Fp>\n\n\u003Cp>我们在rust语言中如何达到相同的效果呢，查阅资料了解到，通过下面方法可以修改进程名\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>nix::libc::{\u003Cspan style=\"color:#79c0ff;font-weight:bold\">PR_SET_NAME\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>prctl};\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>std::ffi::CString;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">main\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>new_name\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>CString::new(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">NewProcessName\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>).expect(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">CString::new failed\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">unsafe\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>prctl(\u003Cspan style=\"color:#79c0ff;font-weight:bold\">PR_SET_NAME\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>new_name.as_ptr()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">as\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">usize\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>但是实际使用后，发现，这种方法修改的进程名并不是\u003Ccode class=\"inline-code\">ps\u003C\u002Fcode>命令显示的进程标题，\u003Ccode class=\"inline-code\">ps\u003C\u002Fcode>命令显示的进程标题还是不变，而是修改了\u003Ccode class=\"inline-code\">pstree\u003C\u002Fcode>命令显示的进程树种的进程名称，所以，这种方法并不能达到我们想要的效果。\u003C\u002Fp>\n\n\u003Cp>我们尝试修改\u003Ccode class=\"inline-code\">argv[0]\u003C\u002Fcode>，在rust中是通过\u003Ccode class=\"inline-code\">env::args()\u003C\u002Fcode>来获取程序的传参，也即argv，追踪到\u003Ccode class=\"inline-code\">env::args()\u003C\u002Fcode>调用的是\u003Ccode class=\"inline-code\">env::args_os()\u003C\u002Fcode>，于是我们有这么一段代码尝试修改argv[0]：\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>std::env;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>std::ffi::{CStr,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>CString,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>OsString};\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>std::os::unix::ffi::OsStringExt;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">set_process_title\u003C\u002Fspan>(title: \u003Cspan style=\"color:#79c0ff\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">str\u003C\u002Fspan>)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>args: Vec\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>OsString\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>env::args_os().collect();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>argv: Vec\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">*\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">i8\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>args.iter()\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>.map(\u003Cspan style=\"color:#ff7b72;font-weight:bold\">|\u003C\u002Fspan>arg\u003Cspan style=\"color:#ff7b72;font-weight:bold\">|\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>arg_cstring\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>CString::new(arg.as_bytes()).expect(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">Failed to create CString\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>arg_cstring.into_raw()\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>})\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>.collect();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>argv.push(std::ptr::null_mut());\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>title_cstring\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>CString::new(title).expect(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">Failed to create CString\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">unsafe\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>strcpy(argv[\u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>]\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">as\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">*\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>c_char,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>title_cstring.as_ptr());\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">main\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>set_process_title(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">MyWorker\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F 继续执行其他操作...\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>但是很遗憾，并没有修改argv[0]的效果，继续追踪\u003Ccode class=\"inline-code\">args_os()\u003C\u002Fcode>发现，其实在多个地方存在\u003Ccode class=\"inline-code\">clone()\u003C\u002Fcode>操作，我们获取到的\u003Ccode class=\"inline-code\">argv\u003C\u002Fcode>早就不是原始的\u003Ccode class=\"inline-code\">argv\u003C\u002Fcode>，\u003Ccode class=\"inline-code\">args_os()\u003C\u002Fcode>的实现如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">stable(feature = \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">env\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">, since = \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">1.0.0\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">)\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">args_os\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; \u003Cspan style=\"color:#f0883e;font-weight:bold\">ArgsOs\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>ArgsOs\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>inner: \u003Cspan style=\"color:#f0883e;font-weight:bold\">sys\u003C\u002Fspan>::args::args()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>\u003Ccode class=\"inline-code\">sys::args::args()\u003C\u002Fcode>的实现如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#a5d6ff\">\u002F\u002F\u002F Returns the command line arguments\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#a5d6ff\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">args\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; \u003Cspan style=\"color:#f0883e;font-weight:bold\">Args\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>imp::args()\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>\u003Ccode class=\"inline-code\">imp::args()\u003C\u002Fcode>的实现如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">args\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; \u003Cspan style=\"color:#f0883e;font-weight:bold\">Args\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Args\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>iter: \u003Cspan style=\"color:#f0883e;font-weight:bold\">clone\u003C\u002Fspan>().into_iter()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>这里\u003Ccode class=\"inline-code\">clone()\u003C\u002Fcode>实现如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">clone\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; Vec\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>OsString\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">unsafe\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F Load ARGC and ARGV, which hold the unmodified system-provided\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F argc\u002Fargv, so we can read the pointed-to memory without atomics\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F or synchronization.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F If either ARGC or ARGV is still zero or null, then either there\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F really are no arguments, or someone is asking for `args()`\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F before initialization has completed, and we return an empty\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F list.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>argv\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79c0ff;font-weight:bold\">ARGV\u003C\u002Fspan>.load(Ordering::Relaxed);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>argc\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">if\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>argv.is_null()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">else\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79c0ff;font-weight:bold\">ARGC\u003C\u002Fspan>.load(Ordering::Relaxed)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>};\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>args\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Vec::with_capacity(argc\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">as\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">usize\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>i\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">in\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">..\u003C\u002Fspan>argc\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>ptr\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">*\u003C\u002Fspan>argv.offset(i)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">as\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">*\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">const\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>libc::c_char;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F Some C commandline parsers (e.g. GLib and Qt) are replacing already\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F handled arguments in `argv` with `NULL` and move them to the end. That\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F means that `argc` might be bigger than the actual number of non-`NULL`\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F pointers in `argv` at this point.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F To handle this we simply stop iterating at the first `NULL` argument.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F `argv` is also guaranteed to be `NULL`-terminated so any non-`NULL` arguments\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F after the first `NULL` can safely be ignored.\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">if\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>ptr.is_null()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">                \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">break\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#79c0ff;font-weight:bold\">\u003C\u002Fspan>;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>cstr\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>CStr::from_ptr(ptr);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>args.push(OsStringExt::from_vec(cstr.to_bytes().to_vec()));\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>args\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>可以看到\u003Ccode class=\"inline-code\">argv\u003C\u002Fcode>是从\u003Ccode class=\"inline-code\">ARGV.load(Ordering::Relaxed);\u003C\u002Fcode>中加载出来的。可以看到argv经历了多次拷贝，最终才到args，然后通过\u003Ccode class=\"inline-code\">args_os()\u003C\u002Fcode>再呈现在我们面前，实际早就不再是最初的那个argv。\u003C\u002Fp>\n",{"id":77,"title":78,"uri":79,"author":10,"tags":80,"created_at":83,"view_count":84,"content":85},100,"初学rust，初始化一个C语言结构体","init-a-clang-struct-with-rust",[12,81,82],"clang","结构体","2023-05-15 20:09:33",151,"\u003Cp>最近用到了libc这个包，调用其中的\u003Ccode class=\"inline-code\">statfs\u003C\u002Fcode>函数，用于查询指定路径挂载的磁盘占用。可以看到\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">statfs\u003C\u002Fspan>(path: \u003Cspan style=\"color:#ff7b72;font-weight:bold\">*\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">const\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>::c_char,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>buf: \u003Cspan style=\"color:#ff7b72;font-weight:bold\">*\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>statfs)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; ::c_int;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>\u003Ccode class=\"inline-code\">statfs\u003C\u002Fcode>第二个参数是一个C语言结构体\u003Ccode class=\"inline-code\">statfs\u003C\u002Fcode>，其定义如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">struct\u003C\u002Fspan> \u003Cspan style=\"color:#f0883e;font-weight:bold\">statfs\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>f_type: ::__fsword_t,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>f_bsize: ::__fsword_t,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>f_blocks: ::fsblkcnt_t,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>f_bfree: ::fsblkcnt_t,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>f_bavail: ::fsblkcnt_t,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>f_files: ::fsfilcnt_t,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>f_ffree: ::fsfilcnt_t,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>f_fsid: ::fsid_t,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>f_namelen: ::__fsword_t,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>f_frsize: ::__fsword_t,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>f_spare: [::__fsword_t;\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">5\u003C\u002Fspan>],\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>如果用常规的rust初始化方法，必须填充结构体的各字段\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>statfs{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">..\u003C\u002Fspan>.,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>f_spare: \u003Cspan style=\"color:#ff7b72;font-weight:bold\">..\u003C\u002Fspan>.,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>可以看到其中\u003Ccode class=\"inline-code\">f_spare\u003C\u002Fcode>字段是一个数组，属于复杂类型，用rust的初始化方式，需要一个个字段的填充，而且需要填充为初始值0，将会非常复杂。其实有一种简单方法，使用\u003Ccode class=\"inline-code\">std::mem::zeroed\u003C\u002Fcode>函数即可。举例如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">statfs\u003C\u002Fspan>(\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>self,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>mount_path: String)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; String {\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>x\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>CString::new(mount_path.as_bytes()).expect(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">covert cstring failed\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>info\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>String::from(\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>statfs_buf\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">unsafe\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>std::mem::zeroed()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>};\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>ret\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">unsafe\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>libc::statfs(x.as_ptr(),\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&amp;\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>statfs_buf)\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>};\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">if\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>ret\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">0\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>info\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>format!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\"> \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">            \u003C\u002Fspan>statfs_buf.f_bsize,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>statfs_buf.f_blocks,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>statfs_buf.f_bfree,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>statfs_buf.f_bavail\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">return\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>info;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>可以看到\u003Ccode class=\"inline-code\">std::mem::zeroed()\u003C\u002Fcode>方法，直接能够初始化一段0值的内存空间，这段空间具体大小，直接由下一行\u003Ccode class=\"inline-code\">libc::statfs(...)\u003C\u002Fcode>调用的第二个参数类型决定，由这一行直接能推导出该申请多大的0空间。\u003C\u002Fp>\n",{"id":87,"title":88,"uri":89,"author":10,"tags":90,"created_at":94,"view_count":95,"content":96},99,"初学rust，tokio无法在spawn中使用MutexGuard","could-not-using-mutex-guard-in-tokio-spawn",[12,91,92,93],"tokio","MutexGuard","spawn","2023-05-05 20:59:20",227,"\u003Cp>最近再次在rust中尝试用tokio::spawn实现类似go语言中goroutine的用法，但是报错了。\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">tokio::main\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">async\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">main\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>cfg\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>cfg::get_config();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>client_id\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>cfg::get_client_id();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>ws_addr\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>cfg.agent.as_ref().unwrap().remote_ws_addr.as_ref().unwrap();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>wsc\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>ws::WebSocketClient::new(ws_addr.clone(),\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>client_id);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>tokio::spawn(wsc.start());\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>monitor_addr\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>cfg.agent.as_ref().unwrap().remote_ws_addr.as_ref().unwrap();\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">mut\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>monitor_client\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>monitor::Monitor::new(monitor_addr.to_string());\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>monitor_client.start().\u003Cspan style=\"color:#ff7b72\">await\u003C\u002Fspan>;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>报错位置在这一行 \u003Ccode class=\"inline-code\">tokio::spawn(wsc.start());\u003C\u002Fcode>，报错内容如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>error: future cannot be sent between threads safely\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>   --&gt; src\u002Fmain.rs:19:18\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>19  |     tokio::spawn(wsc.start());\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    |                  ^^^^^^^^^^^ future returned by `start` is not `Send`\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    = help: the trait `Sync` is not implemented for `std::sync::mpsc::Receiver&lt;Message&gt;`\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>note: future is not `Send` as this value is used across an await\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>   --&gt; src\u002Fws.rs:117:47\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    |\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>115 |                 if let Ok(msg) = rx.recv() {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    |                                  -- has type `&amp;std::sync::mpsc::Receiver&lt;Message&gt;` which is not `Send`\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>116 |                     println!(&#34;Socket Send    : {:?}&#34;, msg);\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>117 |                     let rst = writer.send(msg).await;\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    |                                               ^^^^^^ await occurs here, with `rx` maybe used later\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>...\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>126 |             }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    |             - `rx` is later dropped here\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>help: consider moving this into a `let` binding to create a shorter lived borrow\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>可以看到原因是，我在\u003Ccode class=\"inline-code\">WebSocketClient\u003C\u002Fcode>中用到了\u003Ccode class=\"inline-code\">MutexGuard\u003C\u002Fcode>，而\u003Ccode class=\"inline-code\">MutexGuard\u003C\u002Fcode>不支持被\u003Ccode class=\"inline-code\">tokio::spawn\u003C\u002Fcode>调用。解释参考这篇\u003Ca href=\"https:\u002F\u002Fskyao.io\u002Flearning-tokio\u002Fdocs\u002Ftutorial\u002Fshared-state.html\">文档\u003C\u002Fa>。实际上我是在另一个结构体\u003Ccode class=\"inline-code\">Pty\u003C\u002Fcode>中使用了\u003Ccode class=\"inline-code\">Arc&lt;Mutex&lt;Receiver&lt;Message&gt;&gt;&gt;\u003C\u002Fcode>类型，然后\u003Ccode class=\"inline-code\">WebSocketClient\u003C\u002Fcode>中又实用了\u003Ccode class=\"inline-code\">Pty\u003C\u002Fcode>结构体，所以在调用\u003Ccode class=\"inline-code\">tokio::spawn\u003C\u002Fcode>时报错。\u003C\u002Fp>\n\n\u003Cp>如何解决？别用标准库的Mutex了，用tokio的。而且，我同样发现了\u003Ccode class=\"inline-code\">Sender\u003C\u002Fcode>,\u003Ccode class=\"inline-code\">Receiver\u003C\u002Fcode>都在报类似的错误\u003Ccode class=\"inline-code\">the trait std::marker::Send is not implemented for ...\u003C\u002Fcode>。\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#ff7b72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>std::sync::mpsc::{channel,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Receiver,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Sender}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F 改为\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>tokio::sync::mpsc::channel;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>tokio::sync::mpsc::{Receiver,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Sender};\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>tokio::sync::Mutex;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>\u003Ccode class=\"inline-code\">channel\u003C\u002Fcode>,\u003Ccode class=\"inline-code\">Receiver\u003C\u002Fcode>,\u003Ccode class=\"inline-code\">Sender\u003C\u002Fcode>全部改为tokio版本的，就可以兼容tokio了。\u003C\u002Fp>\n",{"id":98,"title":99,"uri":100,"author":10,"tags":101,"created_at":104,"view_count":105,"content":106},98,"初学rust，多态JSON对象的序列化与反序列化","serialize-and-deserialize-polymorphic-type-in-rust",[12,102,103],"序列化","反序列化","2023-04-03 22:42:14",309,"\u003Cp>在rust中序列化反序列化JSON我们常用的是\u003Ccode class=\"inline-code\">serde\u003C\u002Fcode>这个包，但是json中有一种情况就是存在不确定类型的字段，或者说这个字段可能是多种类型；在golang中，我们用\u003Ccode class=\"inline-code\">interface{}\u003C\u002Fcode>类型来表达，在java中，我们用\u003Ccode class=\"inline-code\">Object\u003C\u002Fcode>表达，那么在rust应该如何表达呢。直接说结果，用enum来组合类型\u003C\u002Fp>\n\n\u003Cp>比如我定义了一种JSON数据结构，如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F 第一种\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>{\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#7ee787\">&#34;msg_type&#34;\u003C\u002Fspan>: \u003Cspan style=\"color:#a5d6ff\">&#34;resize&#34;\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#7ee787\">&#34;content&#34;\u003C\u002Fspan>: {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#7ee787\">&#34;width&#34;\u003C\u002Fspan>: \u003Cspan style=\"color:#a5d6ff\">12\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#7ee787\">&#34;height&#34;\u003C\u002Fspan>: \u003Cspan style=\"color:#a5d6ff\">3\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>}\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u002F\u002F 第二种\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-style:italic\">\u003C\u002Fspan>{\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#7ee787\">&#34;msg_type&#34;\u003C\u002Fspan>: \u003Cspan style=\"color:#a5d6ff\">&#34;ping&#34;\u003C\u002Fspan>,\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    \u003Cspan style=\"color:#7ee787\">&#34;content&#34;\u003C\u002Fspan>: {\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>        \u003Cspan style=\"color:#7ee787\">&#34;ts&#34;\u003C\u002Fspan>: \u003Cspan style=\"color:#a5d6ff\">123\u003C\u002Fspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>    }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>}\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>很明显，两个数据中，content字段表现的类型不一样，在\u003Ccode class=\"inline-code\">msg_type\u003C\u002Fcode>为\u003Ccode class=\"inline-code\">resize\u003C\u002Fcode>时\u003Ccode class=\"inline-code\">content\u003C\u002Fcode>字段是一种结构体，\u003Ccode class=\"inline-code\">msg_type\u003C\u002Fcode>为\u003Ccode class=\"inline-code\">ping\u003C\u002Fcode>时\u003Ccode class=\"inline-code\">content\u003C\u002Fcode>字段是另一种结构体。我们定义枚举和结构体如下\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">derive(Clone, Debug, Deserialize)\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">struct\u003C\u002Fspan> \u003Cspan style=\"color:#f0883e;font-weight:bold\">ControlMessage\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>msg_type: String,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">serde(default)\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>content: \u003Cspan style=\"color:#f0883e;font-weight:bold\">ControlContent\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">derive(Clone, Debug, Deserialize, PartialEq)\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">serde(untagged)\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">enum\u003C\u002Fspan> \u003Cspan style=\"color:#f0883e;font-weight:bold\">ControlContent\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Empty,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Resize(ResizeControl),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Time(TimeControl),\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">impl\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>Default\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">for\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>ControlContent\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">default\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; \u003Cspan style=\"color:#f0883e;font-weight:bold\">Self\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">        \u003C\u002Fspan>Self::Empty\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">derive(Clone, Debug, Deserialize, PartialEq)\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">struct\u003C\u002Fspan> \u003Cspan style=\"color:#f0883e;font-weight:bold\">ResizeControl\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>width: \u003Cspan style=\"color:#ff7b72\">u32\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>height: \u003Cspan style=\"color:#ff7b72\">u32\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">derive(Clone, Debug, Deserialize, PartialEq)\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">struct\u003C\u002Fspan> \u003Cspan style=\"color:#f0883e;font-weight:bold\">TimeControl\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>ts: \u003Cspan style=\"color:#ff7b72\">u32\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>可以看到我们定义了两种类型\u003Ccode class=\"inline-code\">ResizeControl\u003C\u002Fcode>和\u003Ccode class=\"inline-code\">TimeControl\u003C\u002Fcode>，需要注意以下几点：\u003C\u002Fp>\n\n\u003Col>\n\u003Cli>要支持反序列化，所有用到的结构体都需要添加\u003Ccode class=\"inline-code\">Deserialize\u003C\u002Fcode>注解\u003C\u002Fli>\n\u003Cli>枚举中，\u003Ccode class=\"inline-code\">Empty\u003C\u002Fcode>,\u003Ccode class=\"inline-code\">Resize\u003C\u002Fcode>,\u003Ccode class=\"inline-code\">Time\u003C\u002Fcode>这3个都属于枚举的字段名，圆括号()里定义类型，没有定义的表示空\u003C\u002Fli>\n\u003Cli>枚举上，需要添加\u003Ccode class=\"inline-code\">untagged\u003C\u002Fcode>注解\u003C\u002Fli>\n\u003Cli>要为枚举实现\u003Ccode class=\"inline-code\">Default::default\u003C\u002Fcode>方法，否则无法被\u003Ccode class=\"inline-code\">Deserialize\u003C\u002Fcode>注解\u003C\u002Fli>\n\u003Cli>被枚举引用的结构体\u003Ccode class=\"inline-code\">ResizeControl\u003C\u002Fcode>,\u003Ccode class=\"inline-code\">TimeControl\u003C\u002Fcode>，以及枚举\u003Ccode class=\"inline-code\">ControlContent\u003C\u002Fcode>都需要加上\u003Ccode class=\"inline-code\">PartialEq\u003C\u002Fcode>注解，否则无法在枚举圆括号()中引用\u003C\u002Fli>\n\u003C\u002Fol>\n\n\u003Cp>调用反序列化\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">#[\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">test\u003C\u002Fspan>\u003Cspan style=\"color:#8b949e;font-weight:bold;font-style:italic\">]\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">pub\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">fn\u003C\u002Fspan> \u003Cspan style=\"color:#d2a8ff;font-weight:bold\">test_field_deserialize\u003C\u002Fspan>()\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>-&gt; \u003Cspan style=\"color:#f0883e;font-weight:bold\">serde_json\u003C\u002Fspan>::Result\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&lt;\u003C\u002Fspan>()\u003Cspan style=\"color:#ff7b72;font-weight:bold\">&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>{\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>a\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79c0ff\">r\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">#\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;{&#34;msg_type&#34;: &#34;resize&#34;, &#34;content&#34;: {&#34;width&#34;: 12, &#34;height&#34;: 3}}&#34;#\u003C\u002Fspan>;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>v: \u003Cspan style=\"color:#f0883e;font-weight:bold\">ControlMessage\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>serde_json::from_str(a)\u003Cspan style=\"color:#ff7b72;font-weight:bold\">?\u003C\u002Fspan>;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>println!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v: \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{:?}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>v);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>b\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#79c0ff\">r\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">#\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;{&#34;msg_type&#34;: &#34;resize&#34;, &#34;content&#34;: {&#34;ts&#34;: 123}}&#34;#\u003C\u002Fspan>;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72\">let\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>v: \u003Cspan style=\"color:#f0883e;font-weight:bold\">ControlMessage\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>\u003Cspan style=\"color:#ff7b72;font-weight:bold\">=\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>serde_json::from_str(b)\u003Cspan style=\"color:#ff7b72;font-weight:bold\">?\u003C\u002Fspan>;\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>println!\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>(\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">v: \u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">{:?}\u003C\u002Fspan>\u003Cspan style=\"color:#a5d6ff\">&#34;\u003C\u002Fspan>,\u003Cspan style=\"color:#6e7681\"> \u003C\u002Fspan>v);\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>\u003Cspan style=\"color:#6e7681\">    \u003C\u002Fspan>Ok(())\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\u003Cspan style=\"color:#6e7681\">\u003C\u002Fspan>}\u003Cspan style=\"color:#6e7681\">\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Cp>结果调用成功\u003C\u002Fp>\n\n\u003Cpre style=\"color:#e6edf3;background-color:#0d1117;white-space:pre-wrap;word-break:break-word;\">\u003Ccode>\u003Cspan style=\"display:flex;\">\u003Cspan>running 1 test\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>v: ControlMessage { msg_type: &#34;resize&#34;, content: Resize(ResizeControl { width: 12, height: 3 }) }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>v: ControlMessage { msg_type: &#34;resize&#34;, content: Time(TimeControl { ts: 123 }) }\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>test control::test_field_deserialize ... ok\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>\n\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan style=\"display:flex;\">\u003Cspan>test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\n\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n",{"title":108,"list":109},"最热文章",[110,116,122,128,134,140,146,152,158,164],{"id":111,"title":112,"uri":113,"author":10,"created_at":114,"view_count":115},28,"docker容器目录与主机目录同步","\u002Farticle\u002Fdocker容器目录与主机目录同步","2014-12-31 12:34:08",15570,{"id":117,"title":118,"uri":119,"author":10,"created_at":120,"view_count":121},21,"beego中使用fis","\u002Farticle\u002Fbeego中使用fis","2014-12-03 10:47:56",9250,{"id":123,"title":124,"uri":125,"author":10,"created_at":126,"view_count":127},20,"用github登录，oauth开发","\u002Farticle\u002F用github登录，oauth开发","2014-11-23 13:33:37",9113,{"id":129,"title":130,"uri":131,"author":10,"created_at":132,"view_count":133},18,"windows服务注册工具nssm","\u002Farticle\u002Fwindows服务注册工具nssm","2014-10-31 21:34:39",9047,{"id":135,"title":136,"uri":137,"author":10,"created_at":138,"view_count":139},49,"用latex排版中文书籍","\u002Farticle\u002F用latex排版中文书籍","2016-10-31 11:12:02",8634,{"id":141,"title":142,"uri":143,"author":10,"created_at":144,"view_count":145},19,"texlive中文书签乱码","\u002Farticle\u002Ftexlive中文书签乱码","2014-11-15 02:54:01",8461,{"id":147,"title":148,"uri":149,"author":10,"created_at":150,"view_count":151},6,"Windows上的软件包管理器chocolatey","\u002Farticle\u002FWindows上的软件包管理器chocolatey","2014-08-10 15:55:22",8009,{"id":153,"title":154,"uri":155,"author":10,"created_at":156,"view_count":157},3,"利用开源和免费资源搭建CI环境","\u002Farticle\u002F利用开源和免费资源搭建CI环境","2014-07-04 16:54:58",7732,{"id":159,"title":160,"uri":161,"author":10,"created_at":162,"view_count":163},16,"php-fpm网站目录权限配置","\u002Farticle\u002Fphp-fpm网站目录权限配置","2014-10-18 01:36:10",7274,{"id":165,"title":166,"uri":167,"author":10,"created_at":168,"view_count":169},27,"sublime text 2插件开发，外部修改文件无法重新加载","\u002Farticle\u002Fsublime text 2插件开发，外部修改文件无法重新加载","2014-12-26 20:24:13",7054,{"title":171,"list":172},"按月归档",[173,177,180,183,186,189,192,196,200,203,206,209,213,216,219,223,226,229,232,236,239,242,245,248,251,254,257,260,263,266,269,272,275,278,281,284,287,290,293,296,300,303,306,309,312,315],{"title":174,"uri":175,"view_count":176},"2026年7月","\u002Farchive\u002F2026\u002F7\u002F1","[1]",{"title":178,"uri":179,"view_count":176},"2026年1月","\u002Farchive\u002F2026\u002F1\u002F1",{"title":181,"uri":182,"view_count":176},"2025年4月","\u002Farchive\u002F2025\u002F4\u002F1",{"title":184,"uri":185,"view_count":176},"2024年6月","\u002Farchive\u002F2024\u002F6\u002F1",{"title":187,"uri":188,"view_count":176},"2024年5月","\u002Farchive\u002F2024\u002F5\u002F1",{"title":190,"uri":191,"view_count":176},"2024年4月","\u002Farchive\u002F2024\u002F4\u002F1",{"title":193,"uri":194,"view_count":195},"2023年12月","\u002Farchive\u002F2023\u002F12\u002F1","[6]",{"title":197,"uri":198,"view_count":199},"2023年11月","\u002Farchive\u002F2023\u002F11\u002F1","[2]",{"title":201,"uri":202,"view_count":176},"2023年10月","\u002Farchive\u002F2023\u002F10\u002F1",{"title":204,"uri":205,"view_count":176},"2023年7月","\u002Farchive\u002F2023\u002F7\u002F1",{"title":207,"uri":208,"view_count":199},"2023年6月","\u002Farchive\u002F2023\u002F6\u002F1",{"title":210,"uri":211,"view_count":212},"2023年5月","\u002Farchive\u002F2023\u002F5\u002F1","[3]",{"title":214,"uri":215,"view_count":199},"2023年4月","\u002Farchive\u002F2023\u002F4\u002F1",{"title":217,"uri":218,"view_count":199},"2023年3月","\u002Farchive\u002F2023\u002F3\u002F1",{"title":220,"uri":221,"view_count":222},"2023年2月","\u002Farchive\u002F2023\u002F2\u002F1","[5]",{"title":224,"uri":225,"view_count":176},"2023年1月","\u002Farchive\u002F2023\u002F1\u002F1",{"title":227,"uri":228,"view_count":199},"2022年12月","\u002Farchive\u002F2022\u002F12\u002F1",{"title":230,"uri":231,"view_count":222},"2022年11月","\u002Farchive\u002F2022\u002F11\u002F1",{"title":233,"uri":234,"view_count":235},"2022年10月","\u002Farchive\u002F2022\u002F10\u002F1","[4]",{"title":237,"uri":238,"view_count":195},"2022年9月","\u002Farchive\u002F2022\u002F9\u002F1",{"title":240,"uri":241,"view_count":222},"2022年8月","\u002Farchive\u002F2022\u002F8\u002F1",{"title":243,"uri":244,"view_count":176},"2019年7月","\u002Farchive\u002F2019\u002F7\u002F1",{"title":246,"uri":247,"view_count":176},"2019年2月","\u002Farchive\u002F2019\u002F2\u002F1",{"title":249,"uri":250,"view_count":176},"2018年9月","\u002Farchive\u002F2018\u002F9\u002F1",{"title":252,"uri":253,"view_count":176},"2018年8月","\u002Farchive\u002F2018\u002F8\u002F1",{"title":255,"uri":256,"view_count":176},"2017年11月","\u002Farchive\u002F2017\u002F11\u002F1",{"title":258,"uri":259,"view_count":176},"2017年8月","\u002Farchive\u002F2017\u002F8\u002F1",{"title":261,"uri":262,"view_count":176},"2017年5月","\u002Farchive\u002F2017\u002F5\u002F1",{"title":264,"uri":265,"view_count":176},"2017年4月","\u002Farchive\u002F2017\u002F4\u002F1",{"title":267,"uri":268,"view_count":176},"2016年11月","\u002Farchive\u002F2016\u002F11\u002F1",{"title":270,"uri":271,"view_count":176},"2016年10月","\u002Farchive\u002F2016\u002F10\u002F1",{"title":273,"uri":274,"view_count":199},"2016年9月","\u002Farchive\u002F2016\u002F9\u002F1",{"title":276,"uri":277,"view_count":176},"2016年8月","\u002Farchive\u002F2016\u002F8\u002F1",{"title":279,"uri":280,"view_count":199},"2016年7月","\u002Farchive\u002F2016\u002F7\u002F1",{"title":282,"uri":283,"view_count":222},"2016年6月","\u002Farchive\u002F2016\u002F6\u002F1",{"title":285,"uri":286,"view_count":176},"2015年12月","\u002Farchive\u002F2015\u002F12\u002F1",{"title":288,"uri":289,"view_count":176},"2015年10月","\u002Farchive\u002F2015\u002F10\u002F1",{"title":291,"uri":292,"view_count":199},"2015年2月","\u002Farchive\u002F2015\u002F2\u002F1",{"title":294,"uri":295,"view_count":176},"2015年1月","\u002Farchive\u002F2015\u002F1\u002F1",{"title":297,"uri":298,"view_count":299},"2014年12月","\u002Farchive\u002F2014\u002F12\u002F1","[8]",{"title":301,"uri":302,"view_count":199},"2014年11月","\u002Farchive\u002F2014\u002F11\u002F1",{"title":304,"uri":305,"view_count":222},"2014年10月","\u002Farchive\u002F2014\u002F10\u002F1",{"title":307,"uri":308,"view_count":212},"2014年9月","\u002Farchive\u002F2014\u002F9\u002F1",{"title":310,"uri":311,"view_count":212},"2014年8月","\u002Farchive\u002F2014\u002F8\u002F1",{"title":313,"uri":314,"view_count":212},"2014年7月","\u002Farchive\u002F2014\u002F7\u002F1",{"title":316,"uri":317,"view_count":199},"2013年9月","\u002Farchive\u002F2013\u002F9\u002F1",22,{"url":320,"title":321},"https:\u002F\u002Fimage.duguying.net\u002F2022\u002F09\u002Fij6x8o4s.webp","老家 摄于2020年秋",1790062261492]