小编mar*_*llm的帖子

为什么在Rust中将字符串的第一个字母大写如此复杂?

我想把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以这种方式设计?

类似的问题

string rust uppercase

58
推荐指数
5
解决办法
5478
查看次数

使用glib进行垃圾收集时内存泄漏

我正在尝试将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)

c garbage-collection memory-leaks glib boehm-gc

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

为什么bash比C快?

出于好奇,我在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在这种情况下要快得多?

c bash shell

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

如何从目标创建 makefile 先决条件

我正在使用 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 之类的函数。有什么方法可以解决这个限制吗?

makefile gnu-make

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