我如何使用i64/u64与柴油一起使用?
我真的需要实施 diesel::Expression为原始类型trait 吗?
这是我的代码。
Cargo.toml:
[dependencies]
...
diesel = { version = "1.4.5", features = ["sqlite", "numeric"] }
Run Code Online (Sandbox Code Playgroud)
migration/up.sql:
[dependencies]
...
diesel = { version = "1.4.5", features = ["sqlite", "numeric"] }
Run Code Online (Sandbox Code Playgroud)
schema.rs:
CREATE TABLE books (
id INTEGER NOT NULL PRIMARY KEY,
size INTEGER NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
来源:
table! {
books (id) {
id -> Integer,
size -> Integer,
}
}
Run Code Online (Sandbox Code Playgroud)
这给出了以下错误:
use crate::schema::books;
#[derive(Insertable, Queryable)]
#[table_name="books"]
pub struct BookRecord …Run Code Online (Sandbox Code Playgroud) 无法理解我做错了:
pub trait HasName {
fn name() -> String;
}
pub struct WorkerHandler<T: HasName> {
arg: T,
}
impl<T: HasName> WorkerHandler<T> {
pub fn run(arg: T) {
println!("{}", arg.name());
}
}
fn main() {}
Run Code Online (Sandbox Code Playgroud)
这会导致错误:
error: no method named `name` found for type `T` in the current scope
println!("{}", arg.name());
^~~~~~
Run Code Online (Sandbox Code Playgroud)
真正的情况是更复杂一点,但我想解释run的是T实现HasName特质.
我无法实现这种LISP结构
(defun foo (n)
(lambda (i) (incf n i)))
Run Code Online (Sandbox Code Playgroud)
在Rust.我试过这个:
use std::ops::Add;
fn f<T: Add>(n: T) -> Box<Fn(T) -> T> {
Box::new(move |i: T| n + i)
}
fn main() {
let adder = f(2);
assert_eq!(4, adder(2));
}
Run Code Online (Sandbox Code Playgroud)
但它会导致错误:
error: mismatched types:
expected `T`,
found `<T as core::ops::Add>::Output`
(expected type parameter,
found associated type) [E0308]
Box::new(move |i: T| n + i)
^~~~~
Run Code Online (Sandbox Code Playgroud)
似乎Add为外部函数定义的特性没有转移到内部闭包中.
是否有可能实施这样的建设?
可以使用具体类型而不是泛型来实现此函数:
fn f(n: i32) -> Box<Fn(i32) -> i32> {
Box::new(move |i| n …Run Code Online (Sandbox Code Playgroud)