在 Windows 下使用 scoop install nodejs
后,发现安装的是 nodejs16,运行提示:
无法定位程序输入点GetHostNameW于动态链接库WS2_32.dll上。
估计是版本太新,系统不兼容,尝试 scoop uninstall nodejs
和 scoop install nodejs-lst
,
之后运行还是这鬼样子。google搜了一圈,没找到合适的解释。直接:
scoop uninstall nodejs-lst
scoop install nodejs11
我使用的是 Win7 操作系统,从官网下载最新版 zig-windows-x86_64-0.7.1+dfacac916.zip,解压后,发现:
zig 目录下只有一个 zig.exe
命令,没有其他的了,这就简单了,直接把这个目录加 PATH 就行,
因为我使用的是 SpaceVim,不需要修改系统环境变量,直接载入 lang#zig 模块。
[[layers]]
name = 'lang#zig'
在启动函数加一句:
let $PATH .= ';D:\zig'
完成以上的步骤,基本上可以在 Vim 里面使用 zig 语言相关命令了。
在 SpaceVim 里面,运行当前 zig 文件的快捷键是 SPC l r
,
这个快捷键实际上是异步运行 zig run
加上当前文件名。
第一次运行,发现时间是9秒,不知道为什么会这么慢,但是后来的时间都是 0.14 秒左右,可能跟我的电脑有关,比较老了。
基本环境搭建好了,那么就是开始学习基本语法了,瞅了一眼官方文档,发现有一些内容跟 rust 很像,不过总体来说,感觉语法还是有点复杂。
zig 命令提供了一个 zig fmt 的子命令,想测试下如何格式化代码,执行直接报错,zig run 没问题:
这种奇葩问题不该只有我一个人遇到吧,于是谷歌搜了一波,发现两个 github 的 issue:#725,#4605
Github issue 已开,等坑被填了再来试试: #7654
fn get_distance(s1: String, s2: String) -> i32 {
let chars1 = s1.chars().collect::<Vec<char>>();
let chars2 = s2.chars().collect::<Vec<char>>();
let len1 = s1.chars().count();
let len2 = s2.chars().count();
let mut d = vec![vec![0i32; len1 + 1]; len2 + 1];
for i in 0 .. len1 {
d[i][0] = i as i32;
}
for i in 0 .. len2 {
d[0][i] = i as i32;
}
for i in 1 .. len1 + 1 {
for j in 1 .. len2 + 1 {
let mut cost = 1;
if chars1[i-1] == chars2[j-1] {
cost = 0;
}
let delete = d[i-1][j] + 1;
let insert = d[i][j-1] + 1;
let substitution = d[i-1][j-1] + cost;
d[i][j] = min(delete, insert, substitution);
}
}
d[len1][len2]
}
fn min(d: i32, i: i32, s: i32) -> i32 {
let temp = if d > i { i } else { d };
if s < temp {
s
} else {
temp
}
}
pub fn main() {
println!("{}", get_distance("wsdjeg".to_string(), "wdsjgh".to_string()));
}
刚开始接触Rust的时候很多示例代码都是单文件的,随着学习的深入,单个文件里面的代码量越来越大。
此时就需要将单个文件拆分成多个文件。Rust里面关键字mod
可以用来定义一个模块,或者载入一个模块文件。
假定,我们拥有如下文件结构:
rustmod
├── Cargo.toml
└── src
└── main.rs
此时,新建一个文件src/util.rs
,加入如下内容:
pub fn hello_mod() {
println!("{}", "hello mod");
}
此时,就可以在main.rs
内使用mod util
引入util.rs
文件了:
mod util;
fn main() {
util::hello_mod();
}
以上代码块,使用mod util;
载入模块文件,同时在main函数里调用util::hello_mod()
函数,需要说明的是,该函数需要使用pub
关键字进行申明。
rustmod
├── Cargo.toml
└── src
├── main.rs
├── function.rs
└── util.rs
比如,在编写 function.rs
内代码时,偶尔需要使用到uril.rs
里面一些常用的工具函数,该如何操作呢?
// rustmod/src/function.rs
use crate::util;
fn hello_function() {
util::hello_mod();
}
假定有如下目录结构:
rustmod
├── Cargo.toml
└── src
├── main.rs
├── function.rs
└── util.rs
xxx
├── Cargo.toml
└── src
└── lib.rs
修改rustmod/Cargo.toml
:
[package]
name = "testmod"
version = "0.1.0"
authors = ["Shidong Wang"]
edition = "2018"
[dependencies]
xxx = {path= "../xxx" }
此时,就可以在rustmod/src/main.rs
内通过extern crate xxx;
来引入xxx
,修改main.rs
:
extern crate xxx;
use xxx::xxx_func;
fn main() {
xxx_func();
}
在写一个 rust 小工具,需要通过参数读取文件内容,以往使用的一些工具,除了支持通过参数读取指定 文件内容之外,还支持读取 stdin。比如:
cat test.py | python
python test.py
use std::io::{self, BufRead};
fn main() {
let stdin = io::stdin();
for line in stdin.lock().lines() {
println!("{}", line.unwrap());
}
}
在搜索 Rust 相关资料,无意间看到 v2ex 上面的一些字符串相关的问题, 于是使用 rust 来测试下。
题目
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3
输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
输入: “pwwkew” 输出: 3 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,”pwke” 是一个子序列,不是子串。
pub fn main() {
println!("{}", find_longest("aaaa"));
}
fn find_longest(st: &str) -> i32 {
let mut i = 1;
let mut rst = 1;
let mut temp: String = String::new();
for c in st.chars() {
if temp.contains(c) {
i = 1;
temp.clear();
temp.push(c);
} else {
i += 1;
temp.push(c);
}
if i > rst {
rst = i;
}
}
rst - 1
}