小编Lau*_*nce的帖子

如何从标准输入读取操作系统兼容的字符串?

我正在尝试编写一个 Rust 程序,该程序在stdin.

在 Windows 上,我可能会从一个cmd窗口中调用它,例如:

dir /b /s | findstr .*,v$ | rust-prog -n
Run Code Online (Sandbox Code Playgroud)

在 Unix 上,我会使用类似的东西:

find . -name '*,v' -print0 | rust-prog -0
Run Code Online (Sandbox Code Playgroud)

我无法将收到的内容stdin转换为std::path::Path. 据我了解,要获得可在 Windows 或 Unix 上编译的内容,我将需要使用条件编译,std::os::windows::ffistd::os::unix::ffi视情况而定。

此外,似乎在 Windows 上我需要使用kernel32::MultiByteToWideChar当前代码页来创建std::os::windows::ffi::OsStrExt.

有没有更简单的方法来做到这一点?我的建议甚至看起来可行吗?

例如,将字符串转换为路径很容易,因此我尝试使用以下字符串处理函数stdin

use std::io::{self, Read};
fn main() {
    let mut buffer = String::new();
    match io::stdin().read_line(&mut buffer) {
        Ok(n) => println!("{}", buffer),
        Err(error) => println!("error: {}", error)
    } …
Run Code Online (Sandbox Code Playgroud)

rust

5
推荐指数
1
解决办法
567
查看次数

查找忽略重叠的总分钟数(将基于光标的答案转换为CTE)

有一个问题,询问如何查找多个日期范围中有多少分钟,忽略重叠.

给出的示例数据是(userID不是特别相关)

--Available--
ID  userID  availStart          availEnd
1   456     '2012-11-19 16:00'  '2012-11-19 17:00'
2   456     '2012-11-19 16:00'  '2012-11-19 16:50'
3   456     '2012-11-19 18:00'  '2012-11-19 18:30'
4   456     '2012-11-19 17:30'  '2012-11-19 18:10'
5   456     '2012-11-19 16:00'  '2012-11-19 17:10'
6   456     '2012-11-19 16:00'  '2012-11-19 16:50'
Run Code Online (Sandbox Code Playgroud)

我可以使用游标解决问题,但我认为它应该适应CTE,但我无法弄清楚如何做到这一点.

方法是按开始时间排列每个范围然后我们构建一个按顺序合并范围的范围,直到我们找到一个不与我们的合并范围重叠的范围.然后我们计算合并范围内的分钟数,并记住这个我们继续下一个范围,再次合并任何重叠.我们每次得到一个非重叠的起始点时累积分钟.最后,我们将累积的分钟数加到最后一个范围的长度上

很容易看出,由于订单的原因,一旦范围与之前的范围不同,那么没有其他范围可能与以前的范围重叠,因为它们的开始日期都更大.

Declare
  @UserID int = 456,
  @CurStart datetime, -- our current coalesced range start
  @CurEnd datetime, -- our current coalesced range end
  @AvailStart datetime, -- start or range for our next row of …
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-server-2008

3
推荐指数
1
解决办法
655
查看次数

使用 HashSet 规范化 Rust 中的对象

作为一项教育练习,我正在考虑将cvs-fast-export移植到 Rust。

它的基本操作方式是将多个CVS主文件解析成一个中间形式,然后对中间形式进行分析,目的是将其转化为一个git快速导出流。

解析时要做的一件事是将中间形式的公共部分转换为规范表示。一个激励性的例子是提交作者。一个 CVS 存储库可能有数十万个单独的文件提交,但可能少于一千个作者。因此,当您从文件中解析作者时,在解析您输入作者的位置时会使用一个实习表,它会为您提供一个指向规范版本的指针,如果以前没有见过它,则会创建一个新版本。(我也听说过这叫做雾化或实习)。然后这个指针被存储在中间对象上。

我第一次尝试在 Rust 中做类似的事情尝试使用 HashSet作为实习表。请注意,这里使用的是 CVS 版本号而不是作者,这只是一个数字序列,例如 1.2.3.4,表示为Vec.

use std::collections::HashSet;
use std::hash::Hash;

#[derive(PartialEq, Eq, Debug, Hash, Clone)]
struct CvsNumber(Vec<u16>);

fn intern<T:Eq + Hash + Clone>(set: &mut HashSet<T>, item: T) -> &T {
    let dupe = item.clone();
    if !set.contains(&item) {
        set.insert(item);
    }
    set.get(&dupe).unwrap()
}

fn main() {
    let mut set: HashSet<CvsNumber> = HashSet::new();
    let c1 = CvsNumber(vec![1, 2]);
    let c2 = intern(&mut set, c1);
    let c3 = CvsNumber(vec![1, 2]);
    let c4 …
Run Code Online (Sandbox Code Playgroud)

hashset canonicalization rust

3
推荐指数
1
解决办法
881
查看次数