我遇到了一个简化为以下问题的问题:
struct MyIter {
vec: Vec<i8>,
}
fn fill_with_useful_data(v: &mut Vec<i8>) {
/* ... */
}
impl<'a> Iterator for MyIter {
type Item = &'a [i8];
fn next(&mut self) -> Option<&'a [i8]> {
fill_with_useful_data(&mut self.vec);
Some(&self.vec)
}
}
fn main() {
for slice in (MyIter { vec: Vec::new() }) {
println!("{}", slice);
}
}
Run Code Online (Sandbox Code Playgroud)
这会生成错误:
error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates
--> src/main.rs:9:6
|
9 | impl<'a> Iterator for MyIter …Run Code Online (Sandbox Code Playgroud) 据我所知,5.2.9静态void*强制转换中的措辞,唯一一次允许对象 - 指针转换void*的结果是第一次出现逆转换的结果.
在整个标准中,有一堆对指针表示的引用,并且指针的表示与指针的表示void相同char,依此类推,但它似乎从未明确表示投射任意void指针会产生指针在内存中的相同位置,具有不同的类型,非常类似于类型 - 惩罚是未定义的,而不是回到对象的实际类型.
因此,虽然malloc清楚地返回合适内存的地址等等,但就我所见,似乎没有任何方法可以实际使用它.
根据标准,转换函数有一个function-id operator conversion-type-id,就像operator char(&)[4]我相信的那样.但我无法弄清楚函数参数列表的放置位置.GCC不接受任何一种operator char(&())[4]或operator char(&)[4]()或任何我能想到的.
现在,gcc似乎接受(&operator char ())[4]但是clang不接受,而且我也倾向于不接受,因为它似乎不符合我所理解的语法.
我不想使用a,typedef因为我想避免使用它来污染命名空间.
现在我有代码使用rusqlitesqlite绑定打开数据库连接并在我的应用程序中执行一堆数据库操作,如下所示:
extern crate rusqlite;
use rusqlite::SqliteConnection;
struct MyAppState {
db: SqliteConnection,
// ... pretend there's other fields here ...
}
impl MyAppState {
fn new() -> MyAppState {
let db = SqliteConnection::open(":memory:").unwrap();
MyAppState {
db: db
}
}
fn query_some_info(&mut self, arg: i64) -> i64 {
let mut stmt = self.db.prepare("SELECT ? + 1").unwrap();
let mut result_iter = stmt.query(&[&arg]).unwrap();
let result = result_iter.next().unwrap().unwrap().get(0);
result
}
}
fn main() {
let mut app = MyAppState::new();
for i in …Run Code Online (Sandbox Code Playgroud) Lisp在学术界很早就开发了一套有趣的语言功能,但大多数都没有在生产环境中流行.
有些语言,比如JavaScript,改编了基本功能,如垃圾收集和词法闭包,但所有可能实际上改变你大规模编写程序的东西,比如功能强大的宏,代码作为数据的东西和自定义控件结构,似乎在其他功能语言中传播,其中任何一种都不适用于非平凡的项目.
功能编程社区还提出了许多其他有趣的想法(除了函数式编程本身),如引用透明性,通用案例表达式(即模式匹配,不像C/C#开关那样残缺)和curried函数,似乎在常规编程中显然很有用,并且应该很容易与现有的编程实践集成,但由于某种原因似乎永远陷入了学术界.
为什么这些功能很难被采用?是否有任何现代的,实用的语言实际上是从Lisp中学习而不是半复杂地复制"一流的功能",还是存在使这不可能的内在冲突?