鉴于此定义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) 我想在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) 以下是我的问题的简化/摘要版本:
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) 我开始阅读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的任何特定实现中编程,所以我不熟悉代码中使用的内置字,但我是对这个模块系统很好奇.有人能解释它是如何工作的吗?
我想有条件地启用运行时检查和日志记录,彼此独立并独立于调试和发布模式。所以我开始向我的项目添加两个功能,一个称为“不变检查”,另一个称为“日志记录”。最终,我希望通过我在项目范围内可见的板条箱中定义的宏来使用它们。
我曾假设如果我在所有 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)