小编ddu*_*ney的帖子

使用 clap 的 #[derive(Parser)],我如何接受 std::time::Duration?

std::time::Duration我想在命令行上接受 a 。我正在使用clapwith#[derive(Parser)]来生成参数解析器。有什么方法可以直接接受输入,而不是接受数字并稍后进行转换?

像这样的东西:

#[derive(Debug, Parser)]
pub struct Config {
    #[clap( ??? )]
    interval: std::time::Duration,
}
Run Code Online (Sandbox Code Playgroud)

rust clap

9
推荐指数
2
解决办法
5124
查看次数

如何关闭通过 TransformStream 传输的 Web 串行端口?

我有一个 Web 串行端口,我想从中读取一些数据。我想通过使用s 来转换数据TransformStream来进行一些处理(例如将字节解码为字符串、分离出逻辑消息等) 。pipeThrough但是,一旦我这样做,我就无法再通过调用来释放端口上的锁定reader.releaseLock()。我在这里做错了什么?

该代码按照我的预期工作(在安全上下文中在浏览器中运行而无需依赖项):

async serialTestWorking() {
  const port = await navigator.serial.requestPort();

  await port.open({baudRate: 9600});
  console.log("Is locked after open?", port.readable.locked);
  // Prints "Is locked after open? false"

  let reader = port.readable.getReader();
  console.log("Is locked after getReader?", port.readable.locked);
  // Prints "Is locked after getReader? true"

  reader.releaseLock();
  console.log("Is locked after releaseLock?", port.readable.locked);
  // Prints "Is locked after releaseLock? false"

  await port.close();
  console.log("Port closed");
  // Prints "Port closed"
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我用来pipeThrough通过 do-nothing 发送输出TransformStream,那么一切都会崩溃。锁未释放 …

javascript asynchronous stream web-serial-api

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

如何将Windows OsString转换为CString?

std::ffi::OsString在Windows上有一个,但我需要传递一个std::ffi::CStringFFI函数.有没有办法把它转换OsStringCString

我知道在Windows上,OsString由WTF-8编码的缓冲区支持.基本上所有需要发生的事情是附加一个ASCII nul字符并从中创建一个CString.有没有一个好方法呢?如果没有,是否可以直接访问该缓冲区?

这是一些示例代码:

extern "system" fn some_ffi(s: *mut c_char);

fn my_func(os_string: &OsString) {
    let c_string: CString = // ???

    some_ffi(c_string.as_raw())
}
Run Code Online (Sandbox Code Playgroud)

ffi rust

2
推荐指数
1
解决办法
129
查看次数

如何交换可变引用的值,暂时取得所有权?

我有一个函数可以获取某些数据的所有权,对其进行破坏性修改,然后返回它。

fn transform(s: MyData) -> MyData {
    todo!()
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,我有一个&mut MyData参考。我想transform申请&mut MyData.

fn transform_mut(data_ref: &mut MyData) {
    *data_ref = transform(*data_ref);
}
Run Code Online (Sandbox Code Playgroud)

铁锈游乐场

但是,这会导致编译器错误。

error[E0507]: cannot move out of `*data_ref` which is behind a mutable reference
  --> src/lib.rs:10:27
   |
10 |     *data_ref = transform(*data_ref);
   |                           ^^^^^^^^^ move occurs because `*data_ref` has type `MyData`, which does not implement the `Copy` trait
Run Code Online (Sandbox Code Playgroud)

我考虑过使用mem::swapmem::replace,但它们要求您在取出另一个值之前已经有一些有效的值可以放入参考中。

有什么办法可以做到这一点吗?MyData没有合理的默认值或虚拟值来临时存储在引用中。感觉因为我拥有独占访问权限,所以所有者不应该关心转换,但我的直觉在这里可能是错误的。

rust borrow-checker

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