背景:使用 cgo 从 Golang 调用 C 函数。
我想用它有这个签名C函数:int f(int *count, char ***strs)。它将修改countand的数据strs,这就是它使用指向它们的指针的原因。的值count是 的长度strs;strs是一个字符串数组;返回值只是一个(布尔值)指示符,用于说明是否存在错误。
在golang中,我可以count通过使用成功通过和修改C.f((*C.int)(&count));通过[]string使用[]*C.char. 示例代码是这样的:
/*
#include <stdio.h>
int f(int *c, char **str) {
int i;
printf("%d\n", *c);
for (i = 0; i < *c; i++) {
printf("%s\n", str[i]);
}
*c = (*c) + 1;
return 1;
}
*/
import "C"
func go_f(strs []string) int {
count := len(strs)
c_count …Run Code Online (Sandbox Code Playgroud) 在Read特征中,许多函数/方法采用buf: &mut XXXas(其中一个)参数并返回Result<usize>.例如,read_to_string()将其buf: &mut String作为参数之一并返回Result<usize>.
由于我来自许多语言,所谓的现代语言通常会返回read_string()函数调用的字符串.ReadRust类型中的特性设计让我震惊,因为它不返回字符串,而是将其作为参数传递(类似于C或其他更原始的语言).
我知道返回值(Result)用于指示读取是否成功,并且可以将其传递给match表达式.(我以前学过Lisp和Go,所以我不会质疑这种设计.)
为什么核心开发人员没有将这个特性设计为"将字符串与错误消息一起返回"?
例如,为什么不这样设计:
fn read(&mut self) -> Result<String> { ... }
Run Code Online (Sandbox Code Playgroud)
该String还包含了长度,这样用户可以通过调用访问长度.len()在需要的时候.用户可以将其连接到String他希望的任何其他人,但关键点是在调用此函数之前不需要创建/拥有一个.
是否有任何特殊的理由来设计这种特性,就像现在这样?
ps我还在学习Rust(通过遵循Rust编程语言),并在阅读了大部分第一版后阅读第二版.如果上面的代码包含任何错误(特别是在处理生命周期时),请纠正我.
我正在使用SPARQL来构建查询,并想排除某些结果。
我知道FILTER NOT EXISTS可以用来完成任务。例如:
SELECT * {
?sub a ?type .
FILTER NOT EXISTS {?sub a :NotExpectedType.}
}
Run Code Online (Sandbox Code Playgroud)
但是在探索过程中,我偶然发现自己可以写作!a。这是有效的SPARQL查询,但结果与有所不同FILTER NOT EXISTS。例如:
SELECT * {
?sub a ?type .
?sub !a :NotExpectedType .
}
Run Code Online (Sandbox Code Playgroud)
那是什么!a意思呢?(我知道这a是的快捷方式rdf:type,但这还不能帮助我理解。)