在 Rust 中传递闭包非常简单,但是在存储闭包以供重用时,有多种解决方案(使用通用函数类型、引用闭包或盒子、盒子是否有'static生命周期?...)。
虽然我使用不同类型的盒装类型多次对此感到困惑,但阅读类似的问答,甚至可能在回答这个问题时冒险猜测。我不知道如何处理这个问题,即使是简单/明显的情况,或者一个好的起点是什么。
为了使问题更具体,什么是使此示例存储函数以供重用的好方法,使用构建器模式存储稍后调用的闭包。
// This example looks a bit long but its really very simple.
// * This example is most of the way to implementing the builder pattern,
// it ust runs the code immediately instead of storing input
// to run on `build()`.
// * Changes should only be needed where the comment `stored closures:`
// has been written.
// * I've attempted to make this example as generic as possible,
// but not …Run Code Online (Sandbox Code Playgroud) 有没有办法按名称访问struct成员的TypeId(std::any::TypeId::of::<T>)?
如果我有一个基本结构:
MyStruct {
value: i64,
}
Run Code Online (Sandbox Code Playgroud)
而且我只知道MyStruct并且value,有没有办法访问TypeId::of::<i64>- 哪里i64取决于类型value?
main () {
assert_eq!(
TypeId::of::<i64>,
// ^^^ this works
type_id_of!(MyStruct, value),
// ^^^ this is what I'm looking for
);
}
Run Code Online (Sandbox Code Playgroud)
请参阅相关问题:是否可以访问函数签名或声明的结构成员类型?
除了执行以下操作之外,还有更好的方法来打印/格式化字符串缩进:
let text_to_indent = "Indented text!";
for i in 0..indent {
print!(" ");
}
println!("{}", text_to_indent);
Run Code Online (Sandbox Code Playgroud)
Rust有更方便的方法吗?
是否存在字节序列,当转换为f32或者f64在Rust中产生未定义的行为时?我将非有限值(例如NaN,Infinity等)计为有效浮点值.
对此答案的评论暗示可能存在从原始字节转换浮点数的问题.
因为编写将脚本数量传递给命令的shell脚本很常见,所以我很想知道在主流*Unix系统上获得处理器数量的好方法是什么.
事情是这样,但不依赖于Python的.
*通过主流,我的意思是,它将适用于今天生产中使用的流行的Unix系统(Linux/BSD/Darwin?但是越便携越好).
我已经看到用于内存分配器的包装器的两个术语,它们之间有什么区别?(如果有的话)
我正在研究C中的一个问题,我对它有一个快速的问题.问题如下:比如说,我给出了一些排序的整数数组a[i] = { 1, 2, 3, 3, 3 }.现在,我应该运行一个搜索给定整数的程序,返回第一次出现的位置以及该数组中该整数的出现次数.
所以,如果我正在搜索3那么我会第一次出现,a[2]并且有三次出现3.对于第一个发现第一次出现的部分,我可以简单地使用strcspn字符串头文件.但是,对于第二部分,是否有一个内置函数可以计算特定整数的实例数?
通过简单地增加一个计数器变量,我实际上可以用我的"赤手空拳"做到这一点.但是,我的教授给了我一个提示,返回类型应该是size_t,这表明可以使用一些内置函数.任何帮助,将不胜感激.
谢谢,亚历山大
是否有任何工具(最好在Linux上)可以在参数定义为较小的数组时发出警告,然后原型指定?
例如:
void somefunc(float arg[10]); /* normally this would be defined in a header */
void my_func(void)
{
float arg[2];
somefunc(arg); /* <-- this could be a warning */
}
Run Code Online (Sandbox Code Playgroud)
我意识到这不是无效的代码,但它可以解决一些常见的错误,如果它可以警告它(最近碰到其中一个错误).
一些工具(例如clang静态检查器)会在函数位于同一个文件中并在数组边界外设置一个值时发出警告,但我想知道如果arg比原型单独小,是否有任何事情会发出警告.
我用过cppcheck,clang,smatch,splint,gcc's -Wextra ......但没有人抱怨这个.
有没有一种方法可以使用传递给它的定义值,而不是定义文本本身?
这是一个奇怪的例子,我预计可以使用预处理器.
一个被调用的C文件test.c,其中包含两次自定义两个不同的函数main.
#ifndef IS_INDIRECT
#define IS_INDIRECT
/* int */
#define NUMTYPE int
#define PREFIX int_
#include "test.c"
#undef NUMTYPE
#undef PREFIX
/* short */
#define NUMTYPE float
#define PREFIX float_
#include "test.c"
#undef NUMTYPE
#undef PREFIX
#include <stdio.h>
int main(int argc, const char **argv)
{
printf("test int %d\n", int_squared(4));
printf("test float %f\n", float_squared(2.5));
return 0;
}
#else
/* function body */
#define fn(prefix, id) prefix ## id
NUMTYPE fn(PREFIX, squared)(NUMTYPE val)
{
return …Run Code Online (Sandbox Code Playgroud) 对于具有可以比较的多个成员的结构或者sort_by回调,将数据与优先级进行比较是很常见的.
// Example of sorting a: Vec<[f64; 2]>, sort first by y, then x,
xy_coords.sort_by(
|co_a, co_b| {
let ord = co_a[1].cmp(&co_b[1]);
if ord != std::cmp::Ordering::Equal {
ord
} else {
co_a[0].cmp(&co_b[0])
}
}
);
Run Code Online (Sandbox Code Playgroud)
是否有更简单的方法来执行多个cmp函数,其中只返回第一个不相等的结果?