小编Rya*_*729的帖子

有条件地从flat_map返回空迭代器

鉴于此定义foo:

let foo = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
Run Code Online (Sandbox Code Playgroud)

我希望能够编写这样的代码:

let result: Vec<_> = foo.iter()
    .enumerate()
    .flat_map(|(i, row)| if i % 2 == 0 {
        row.iter().map(|x| x * 2)
    } else {
        std::iter::empty()
    })
    .collect();
Run Code Online (Sandbox Code Playgroud)

但是这引发了关于if和else子句具有不兼容类型的错误.我尝试map暂时删除,我尝试在闭包外定义一个空向量,然后返回迭代器,如下所示:

let empty = vec![];

let result: Vec<_> = foo.iter()
    .enumerate()
    .flat_map(|(i, row)| if i % 2 == 0 {
        row.iter() //.map(|x| x * 2)
    } else {
        empty.iter()
    })
    .collect();
Run Code Online (Sandbox Code Playgroud)

这似乎有点傻,但它编译.如果我试图取消注释map然后它仍然抱怨if和else子句具有不兼容的类型.以下是错误消息的一部分:

error[E0308]: if and …
Run Code Online (Sandbox Code Playgroud)

iteration iterator rust

6
推荐指数
2
解决办法
746
查看次数

有没有更惯用的方法来保持可选参数字符串被释放?

我想在Rust程序中获取命令行参数并将它们传递给C函数.但是,这些参数是可选的,如果没有提供参数,程序应该表现不同.我已经阅读了文档,CString::as_ptr但是我曾希望保留一个Option包含参数的局部变量(如果存在)将使其String不被释放,如下例所示.

这个Rust代码:

extern crate libc;

use std::ffi::CString;

extern "C" {
    fn print_in_c(opt_class: *const libc::c_char) -> libc::c_int;
}

fn main() {
    let mut args = std::env::args();
    //skip execuatble name
    args.next();

    let possible_arg = args.next();

    println!("{:?}", possible_arg);

    let arg_ptr = match possible_arg {
        Some(arg) => CString::new(arg).unwrap().as_ptr(),

        None => std::ptr::null(),
    };

    unsafe {
        print_in_c(arg_ptr);
    };
}
Run Code Online (Sandbox Code Playgroud)

与此C代码一起:

#include <stdio.h>
int
print_in_c(const char *bar)
{
  puts("C:");
  puts(bar);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但这没效果.传递参数"foo"时,代码打印出以下内容:

Some("foo")
C:
Run Code Online (Sandbox Code Playgroud)

后跟一个空白行.

如果我将Rust代码更改为以下内容,我得到了打印正确文本的程序:

extern crate libc; …
Run Code Online (Sandbox Code Playgroud)

c ffi command-line-arguments rust

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

如何在Flat_map中获取值的所有权

以下是我的问题的简化/摘要版本:

fn main() {
    let foo_selectors = vec![0, 1];

    let foos: Vec<_> = foo_selectors
        .into_iter()
        .flat_map(|i| get_foo(i).into_iter())
        .collect();

    println!("{:?}", foos);
}

fn get_foo(i: u8) -> [u8; 3] {
    if i % 2 == 0 {
        [1, 2, 3]
    } else {
        [4, 5, 6]
    }
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接

我收到以下错误消息:

fn main() {
    let foo_selectors = vec![0, 1];

    let foos: Vec<_> = foo_selectors
        .into_iter()
        .flat_map(|i| get_foo(i).into_iter())
        .collect();

    println!("{:?}", foos);
}

fn get_foo(i: u8) -> [u8; 3] {
    if i % 2 == …
Run Code Online (Sandbox Code Playgroud)

iterator rust

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

这三行Forth模块系统如何工作?

我开始阅读Thinking Forth.在书中,作者提到了一个三线模块系统,其中提到了Forth会议的记录.这是一个PDF,其中包含从第14页开始的模块系统的描述(打印时为132).

这是关于如何使用三个定义的单词的说明INTERNAL,EXTERNAL以及MODULE.

模块是INTERNAL和MODULE之间的程序的一部分.在INTERNAL和EXTERNAL之间写入模块本地的常量,变量和例程的定义.在模块外部使用的定义写在EXTERNAL和MODULE之间.[例程的局部变量]在INTERNAL和EXTERNAL之间定义.引用它们的例程在EXTERNAL和MODULE之间定义.

这是代码本身:

: INTERNAL ( --> ADDR) CURRENT @ @ ; 
: EXTERNAL ( --> ADDR) HERE ;
: MODULE( ADDRl ADDR2 --> )PFA LFA ! ; 
Run Code Online (Sandbox Code Playgroud)

我正在阅读这本关于如何编写软件的想法,而不是如何在Forth的任何特定实现中编程,所以我不熟悉代码中使用的内置字,但我是对这个模块系统很好奇.有人能解释它是如何工作的吗?

module forth

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

如何激活所有板条箱中的功能?

我想有条件地启用运行时检查和日志记录,彼此独立并独立于调试和发布模式。所以我开始向我的项目添加两个功能,一个称为“不变检查”,另一个称为“日志记录”。最终,我希望通过我在项目范围内可见的板条箱中定义的宏来使用它们。

我曾假设如果我在所有 crate 中以相同的方式填写features 部分,那么当我在编译 bin crate 时激活该功能时,所有 lib crate 也会启用该功能,但这不是案子!如何跨多个板条箱启用和禁用功能?希望这可以通过只改变一件事来完成,比如货物的命令行参数。

为了确切说明我想要什么,这里有一个示例,我还将在下面重现:

共有三个 crate,main、bin、crate 和两个 lib crate,分别称为“中间”和“普通”。以下是相关文件的相关部分:

主文件

extern crate common;
extern crate middle;

fn main() {
    common::check!();

    middle::run();

    println!("done");
}
Run Code Online (Sandbox Code Playgroud)

Cargo.toml

[dependencies]

[dependencies.common]
path = "libs/common"

[dependencies.middle]
path = "libs/middle"

[features]
default = []
invariant-checking = []
logging = []
Run Code Online (Sandbox Code Playgroud)

中间的lib.rs

extern crate common;

pub fn run() {
    common::check!();

    common::run();
}
Run Code Online (Sandbox Code Playgroud)

中间的Cargo.toml

[dependencies]

[dependencies.common]
path = "../common"

[features]
default = …
Run Code Online (Sandbox Code Playgroud)

compilation rust rust-cargo

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