小编Anu*_*aki的帖子

如何通过 Rust 在 Mac OS 上交叉编译 openssL 库?

当我在MacOS上编译Linux二进制文件时,遇到了这个问题:看起来rust库“openssl-sys v0.9.61”绑定到了MacOS的C库。无法链接到linux。

cargo build --release --target=x86_64-unknown-linux-musl
   Compiling openssl-sys v0.9.61
error: failed to run custom build command for `openssl-sys v0.9.61`

Caused by:
  process didn't exit successfully: `~/test/../bin/release/build/openssl-sys-96148dcd52905249/build-script-main` (exit status: 101)
  --- stdout
  cargo:rustc-cfg=const_fn
  cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_MUSL_OPENSSL_LIB_DIR
  X86_64_UNKNOWN_LINUX_MUSL_OPENSSL_LIB_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_LIB_DIR
  OPENSSL_LIB_DIR unset
  cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_MUSL_OPENSSL_INCLUDE_DIR
  X86_64_UNKNOWN_LINUX_MUSL_OPENSSL_INCLUDE_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_INCLUDE_DIR
  OPENSSL_INCLUDE_DIR unset
  cargo:rerun-if-env-changed=X86_64_UNKNOWN_LINUX_MUSL_OPENSSL_DIR
  X86_64_UNKNOWN_LINUX_MUSL_OPENSSL_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_DIR
  OPENSSL_DIR unset
  cargo:rerun-if-env-changed=OPENSSL_NO_PKG_CONFIG
  cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_x86_64-unknown-linux-musl
  cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_x86_64_unknown_linux_musl
  cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_ALLOW_CROSS
  cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS
  cargo:rerun-if-env-changed=PKG_CONFIG_x86_64-unknown-linux-musl
  cargo:rerun-if-env-changed=PKG_CONFIG_x86_64_unknown_linux_musl
  cargo:rerun-if-env-changed=TARGET_PKG_CONFIG
  cargo:rerun-if-env-changed=PKG_CONFIG
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64-unknown-linux-musl
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64_unknown_linux_musl
  cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_SYSROOT_DIR
  cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR
  run pkg_config fail: "pkg-config has not been configured to support cross-compilation.\n\n                Install a sysroot for the target …
Run Code Online (Sandbox Code Playgroud)

linux openssl rust

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

是否有更优雅的方法来使用默认字符串解开 Option<Cookie> ?

我想打开 cookie 或返回一个空的&str时间None

let cookie: Option<Cookie> = req.cookie("timezone");

// right, but foolish:
let timezone: String = match cookie {
    Some(t) => t.value().to_string(),
    None => "".into(),
};
Run Code Online (Sandbox Code Playgroud)

这是一个错误:

let timezone = cookie.unwrap_or("").value();
Run Code Online (Sandbox Code Playgroud)

rust option-type

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

如何在 poll() 方法中调用异步函数?

我想在 Future::poll() 中调用异步函数,但 poll() 不是异步函数,所以我必须轮询异步 fn,但出现错误:

error[E0599]: no method named `poll` found for opaque type `impl Future` in the current scope
  --> src\lib.rs:18:22
   |
18 |         let a = fut1.poll(cx);
   |                      ^^^^ method not found in `impl Future`
Run Code Online (Sandbox Code Playgroud)

我尝试 Pin::new(async fn()).poll(),得到另一个错误:

error[E0277]: `from_generator::GenFuture<[static generator@src\lib.rs:33:23: 36:2 {ResumeTy, u64, Duration, impl Future, ()}]>` cannot be unpinned
  --> src\lib.rs:22:23
   |
22 |         let pinfut1 = Pin::new(&mut fut1);
   |                       ^^^^^^^^ within `impl Future`, the trait `Unpin` is not implemented for `from_generator::GenFuture<[static generator@src\lib.rs:33:23: 36:2 {ResumeTy, …
Run Code Online (Sandbox Code Playgroud)

future rust

5
推荐指数
2
解决办法
394
查看次数

在编译时没有已知的大小

use std::fmt::Debug;

#[derive(Debug)]
struct Node<K: Debug, V: Debug> {
    key: K,
    value: V,
}

fn myprint<K: Debug + ?Sized, V: Debug + ?Sized>(node: &Node<K,V>) -> String {
    return format!("{:?}: {:?}", node.key, node.value);
}

fn main() {
    let node = Node{key: "xxx", value: "yyy"};
    myprint(&node);
}
Run Code Online (Sandbox Code Playgroud)

编译错误:

use std::fmt::Debug;

#[derive(Debug)]
struct Node<K: Debug, V: Debug> {
    key: K,
    value: V,
}

fn myprint<K: Debug + ?Sized, V: Debug + ?Sized>(node: &Node<K,V>) -> String {
    return format!("{:?}: {:?}", node.key, node.value);
}

fn …
Run Code Online (Sandbox Code Playgroud)

rust

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

如何在 actix-web 2.0 中间件中获取 web::Data&lt;Pool&lt;MySql&gt;&gt; ?

通常,我可以像这样设置数据App并从中获取数据:web::Data

let pool = sqlx::MySqlPool::connect("mysql://xxx")
    .await
    .expect("Mysql Connect error!");
HttpServer::new(move || {
    // set the data pool: Pool<MySQL>
    App::new()
        .data(pool.clone())
        .service(web::resource("/home").route(web::get().to(get_xxx)))
})
.bind("0.0.0.0:8000")?
.run()
.await;
Run Code Online (Sandbox Code Playgroud)
// get the data: pool: Pool<MySQL> from argument.
pub async fn get_xxx(
    pool: web::Data<Pool<MySql>>,
    path: web::Path<String>,
) -> Result<HttpResponse, Error> {
    let mut pool = pool.clone();
    todo!()
}
Run Code Online (Sandbox Code Playgroud)

如何获取pool: Pool<MySQL>中间件?

这是中间件的示例:

use std::task::{Context, Poll};

use actix_service::{Service, Transform};
use actix_web::dev::{ServiceRequest, ServiceResponse};
use actix_web::{Error, HttpResponse};
use futures::future::{ok, Either, Ready};

pub struct CheckLogin; …
Run Code Online (Sandbox Code Playgroud)

middleware rust actix-web

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

有没有一种简单的方法从数组中删除重复元素?

我想从数组中删除重复的元素:

use itertools::Itertools;
use std::collections::HashSet;

#[derive(Debug)]
struct Person {
    name: String,
    age: u32,
}

fn main() {
    let arr = [
        Person { name: "aaa".to_string(), age: 10 },
        Person { name: "bbb".to_string(), age: 20 },
        Person { name: "bbb".to_string(), age: 20 },
        Person { name: "ccc".to_string(), age: 30 },
    ];

    // Way 1:
    let arr2 = {
        let names: Vec<_> = arr.iter().map(|v| v.name.clone()).unique().collect();
        names
            .iter()
            .map(|name| arr.iter().find(|person| &person.name == name).unwrap())
            .collect::<Vec<_>>()
    };
    dbg!(arr2);

    // Way 2:
    let arr2 = { …
Run Code Online (Sandbox Code Playgroud)

arrays duplicates rust

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

如何将通用 T 发送到另一个线程?

如何发送通用T

我尝试将泛型发送T到另一个线程,但我得到:

error[E0308]: mismatched types
  --> src/main.rs:23:22
   |
23 |             t1.merge(Element(vec![3]));
   |                      ^^^^^^^^^^^^^^^^ expected associated type, found struct `Element`
   |
   = note: expected associated type `<T as Join>::Item`
                       found struct `Element`
   = help: consider constraining the associated type `<T as Join>::Item` to `Element`
Run Code Online (Sandbox Code Playgroud)

完整代码:

trait Join {
    type Item;
    fn merge(&mut self, other: Self::Item);
}

#[derive(Debug, Default)]
struct Element(Vec<u8>);

impl Join for Element {
    type Item = Element;
    fn merge(&mut self, mut other: Self::Item) {
        self.0.append(&mut …
Run Code Online (Sandbox Code Playgroud)

generics multithreading traits rust parametric-polymorphism

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

如何将特定类型转换为泛型类型(所有内置类型)?

我想将特定类型返回到泛型类型,都是内置类型,所以不能 impl From for u32 { ... }

fn fn1<T>() -> T {
    let a = 123u64;
    a as T
    // ^^^^^^ an `as` expression can only be used to convert between primitive types or to coerce to a specific trait object
}

fn main() {
    let a = fn1::<u32>();
    dbg!(a);
}
Run Code Online (Sandbox Code Playgroud)

有什么好办法吗?

generics types rust

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