小编hel*_*low的帖子

为什么处理对象经常出现为指向指针的指针

将句柄的句柄设置为指针指针但不是指针的意图是什么?如下代码:

FT_Library library;
FT_Error error = FT_Init_FreeType( &library );
Run Code Online (Sandbox Code Playgroud)

哪里

typedef struct FT_LibraryRec_  *FT_Library
Run Code Online (Sandbox Code Playgroud)

所以&library是一个FT_LIBraryRec_类型的句柄FT_LIBraryRec_**

c pointers handle pointer-to-pointer

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

由main()返回的值混淆

我已经在Xcode 10.0(clang:Apple LLVM版本10.0.0)中的macOS上编译并执行了这段代码,它正在返回255.另一方面,在Visual Studio Community Edition v.15.8.6中的Windows上,它正在返回-1.有人可以在macOS上解释这种行为吗?代码如下.

int main() {
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

c++ macos

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

Wrong trait chosen based on type parameter

I have a binary trait Resolve.

pub trait Resolve<RHS = Self> {
    type Output;
    fn resolve(self, rhs: RHS) -> Self::Output;
}
Run Code Online (Sandbox Code Playgroud)

I implemented the trait for something trivial where both arguments are taken by reference (self is &'a Foo and rhs is &'b Foo):

struct Foo;

impl <'a, 'b> Resolve<&'b Foo> for &'a Foo {
    type Output = Foo;
    fn resolve(self, rhs: &'b Foo) -> Self::Output {
        unimplemented!()
    }
}
Run Code Online (Sandbox Code Playgroud)

If I now write

fn main() { …
Run Code Online (Sandbox Code Playgroud)

rust

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

如何声明一个函数而不实现它?

我想比较函数的不同实现的程序集,但我不想实现某些功能,只需声明它们。

在 Rust 中,前向声明通常是不必要的,因为编译器不需要函数来解析它们(与 C 中不同)。但是,是否有可能做一些等同于前向声明的事情?

rust

3
推荐指数
2
解决办法
628
查看次数

为什么对const进行静态引用会返回对临时变量的引用?

在Rust中,我有以下代码:

pub trait Test: Sized {
    const CONST: Self;
    fn static_ref() -> &'static Self {
        &Self::CONST
    }
}
Run Code Online (Sandbox Code Playgroud)

我的期望是,既然const是'static,那么我应该能够引用也是'static。但是,编译器给出以下错误:

pub trait Test: Sized {
    const CONST: Self;
    fn static_ref() -> &'static Self {
        &Self::CONST
    }
}
Run Code Online (Sandbox Code Playgroud)

这里如何引入临时变量?

此外,似乎在某些情况下引用常量确实有效。这是一个简短的具体示例,其中Test的实现略有不同

pub trait Test: Sized {
    fn static_ref() -> &'static Self;
}

struct X;

impl Test for X {
    fn static_ref() -> &'static Self {
        &X
    }
}
Run Code Online (Sandbox Code Playgroud)

lifetime rust borrow-checker

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

在Rust中,我如何将发散函数作为参数传递给另一个函数

非分散功能可以正常工作

fn test(f: &Fn() -> u8) {}
Run Code Online (Sandbox Code Playgroud)

但是我不能接受这样的分歧功能

fn test_diverging(f: &Fn() -> !) {}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

error[E0658]: The `!` type is experimental (see issue #35121)
  --> examples/two_tasks.rs:44:31
   |
44 | fn test_diverging(f: &Fn() -> !) {}
   |                               ^

Run Code Online (Sandbox Code Playgroud)

查看问题#35121,我可以看到如何解决该问题,但与此同时可以解决此问题?

rust

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

serde:加速自定义枚举反序列化

我的程序解析了足够大的 json 文档(30MB),在 CPU 速度较慢的机器上需要 70 毫秒,我想加快这个过程,我发现 27% 的解析发生在我的foo_document_type_deserialize.有没有办法在String这里跳过分配:let s = String::deserialize(deserializer)?;?

我完全确定表示枚举值的字符串不包含特殊的 json 字符,例如\b \f \n \r \t \" \\,因此使用未转义的字符串应该是安全的。

use serde::{Deserialize, Deserializer};

#[derive(Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct FooDocument {
    // other fields...
    #[serde(rename = "type")]
    #[serde(deserialize_with = "foo_document_type_deserialize")]
    doc_type: FooDocumentType,
}

fn foo_document_type_deserialize<'de, D>(deserializer: D) -> Result<FooDocumentType, D::Error>
where
    D: Deserializer<'de>,
{
    use self::FooDocumentType::*;
    let s = String::deserialize(deserializer)?;
    match s.as_str() {
        "tir lim bom bom" => Ok(Var1), …
Run Code Online (Sandbox Code Playgroud)

rust serde

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

获取历史而不检出

对于一个项目,我需要知道两个修订之间的所有提交。

通常,只需克隆存储库并检查历史记录即可。我不需要文件实际存在于文件系统中,我只对历史本身感兴趣。
由于大型存储库的性质,克隆它们可能需要一些时间。

有没有一种方法可以在最短的时间内仅获取历史记录(甚至两个修订之间的历史记录)?是否有可能实际上不检出文件(因为我猜这就是最耗时的时间)。

git libgit2

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

映射到无克隆的载体

我正在尝试使用此签名编写一个函数,而不使用clone()或分配新的向量:

fn mapVec(f: Fn(T) -> T, x: Vec<T>) -> Vec<T>
Run Code Online (Sandbox Code Playgroud)

在我看来,这似乎是可行的。对于中的每个元素x,我们将其传递给f,并f获得所有权。然后,我们产生一个返回值,然后,作为f已传递值的所有权,如果有必要,它将销毁它。然后,我们将返回值放回向量中。拥有的所有权后x,我们可以对其进行修改,然后将其返回给调用方。

我的尝试如下:

for e in x.iter_mut() {
    *e = f(e);
}
return x;
Run Code Online (Sandbox Code Playgroud)

但不幸的是f期望一个T,而不是一个&mut T。

我不想将其签名更改mapVec为例如使用可变函数,如果可能的话,我希望它看起来像是一个外部纯函数,只是利用内部的变异,因为我们可以摆脱它,因为调用者已将对象的所有权传递给我们。

rust

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

我是移动还是克隆此字符串

我有一个这样定义的枚举:

#[derive(Clone, Debug)]
pub enum JsonState {
    NameReadingState(String),
    StringState(String),
}

impl JsonState {
    pub fn get_name_read(self) -> String {
        if let JsonState::NameReadingState(name) = self {
            return name;
        } else {
            panic!(
                "Error: attempted to get name from non name state {:#?}",
                self
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我要调用get_name_read的实例,则JsonState该字符串将被移出枚举还是被复制?我的理解是,由于我正在传递self而不是&self在函数内部获取实例的所有权,因此我应该能够简单地将字符串移出该函数。

rust

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

标签 统计

rust ×7

borrow-checker ×1

c ×1

c++ ×1

git ×1

handle ×1

libgit2 ×1

lifetime ×1

macos ×1

pointer-to-pointer ×1

pointers ×1

serde ×1