我想把a的第一个字母大写&str.这是一个简单的问题,我希望有一个简单的解决方案.直觉告诉我做这样的事情:
let mut s = "foobar";
s[0] = s[0].to_uppercase();
Run Code Online (Sandbox Code Playgroud)
但是&strs不能像这样编入索引.我能够做到这一点的唯一方法似乎过于复杂.我将转换&str为迭代器,将迭代器转换为向量,大写为向量中的第一项,它创建了一个迭代器,我将其编入索引,创建一个Option,我打开它给我一个上面的首字母.然后我将矢量转换为迭代器,我将其转换为a String,我将其转换为a &str.
let s1 = "foobar";
let mut v: Vec<char> = s1.chars().collect();
v[0] = v[0].to_uppercase().nth(0).unwrap();
let s2: String = v.into_iter().collect();
let s3 = &s2;
Run Code Online (Sandbox Code Playgroud)
有没有比这更简单的方法,如果有,那又怎样?如果没有,为什么Rust以这种方式设计?
我正在尝试将Boehm垃圾收集器与GLib集成在Linux中,但在一种情况下,我发现它并没有释放内存:当我多次调用g_strsplit时,它会耗尽内存和段错误.垃圾收集器的README警告它可能无法在动态库中查找指针,并且可能需要使用GC_add_roots.
为了测试这一点,我将GLib中的所有相关代码复制到我的源文件中,而不是根据libglib-2.0.so进行链接.这消除了段错误,这告诉我这确实是问题所在.但是,没有关于如何使用GC_add_roots来解决此问题的文档.有人能帮我吗?
以下是导致内存泄漏的代码:
#include <glib.h>
#include <gc.h>
void no_free(void *mem) {}
int main() {
g_mem_gc_friendly = TRUE;
GMemVTable memvtable = {
.malloc = GC_malloc,
.realloc = GC_realloc,
.free = no_free,
.calloc = NULL,
.try_malloc = NULL,
.try_realloc = NULL
};
g_mem_set_vtable(&memvtable);
for (int i = 0; i < 10000; i++) {
char **argv = g_strsplit("blah", " ", 0);
argv[0][0] = 'a'; // avoid unused variable warning
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 出于好奇,我在Bash和C之间做了一个特别的基准:
#!/bin/sh
for i in `seq 1 10000`; do
true
done
Run Code Online (Sandbox Code Playgroud)
在我的机器上,这运行0.02秒.非常快.我的理解是Bash解析命令并运行fork/exec.因此,我期望C中的以下版本更快,因为它不需要进行任何解析:
#include <unistd.h>
int main() {
char *const argv[] = { "/bin/true", NULL };
for (int i = 0; i < 10000; i++) {
pid_t pid = fork();
if (pid == 0) // child
execv(argv[0], argv);
int status = 0;
waitpid(pid, &status, 0);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,这花了大约8秒钟!我认为Bash可能正在做一些聪明的优化,如果它有洞察力,那真的只是一个无操作而且根本不值得打电话.所以我尝试使用echo -n和sleep 0.0001进行相同的实验,得到了类似的结果.这些命令肯定会被调用,但Bash没有C语言的fork/exec开销.为什么Bash在这种情况下要快得多?
我正在使用 GNU make,并且正在尝试根据目标创建先决条件。我希望先决条件是目标的基本名称。所以,当我运行这个时:
make a/b/foo.txt
Run Code Online (Sandbox Code Playgroud)
它应该运行这个:
cp foo.txt a/b/foo.txt
Run Code Online (Sandbox Code Playgroud)
这些都不起作用:
a/%.txt: $(basename $@)
cp $< $@
a/%.txt: $(@F)
cp $< $@
a/%.txt: $(shell basename $@)
cp $< $@
a/%.txt: $(basename %)
cp $< $@
a/%.txt: $(shell basename %)
cp $< $@
Run Code Online (Sandbox Code Playgroud)
我已经看到 % 在目标和先决条件中使用,所以我知道将先决条件基于目标是正常的。我也在先决条件中看到了变量,所以这也是正常的。但似乎特殊变量 $@ 和 $(@F) 在先决条件中不可用,以及诸如 basename 和 shell 之类的函数。有什么方法可以解决这个限制吗?