小编ide*_*n42的帖子

如何为原始指针实现`Default`?

在结构中使用原始点时,Rust不允许从Default派生.

例如:

#[derive(Default)]
struct Foo {
    bar: *mut Foo,
    baz: usize,
}
Run Code Online (Sandbox Code Playgroud)

报告

error[E0277]: the trait bound `*mut Foo: std::default::Default` is not satisfied
Run Code Online (Sandbox Code Playgroud)

我试过这个,但它不起作用:

impl Default for *mut Foo {
    fn default() -> *mut Foo {
        ptr::null_mut()
    }
}
Run Code Online (Sandbox Code Playgroud)

这给出了一个错误:

impl doesn't use types inside crate
Run Code Online (Sandbox Code Playgroud)

有没有办法声明Default原始指针?

否则我将不得不default为任何struct包含原始指针的函数编写显式函数,在本例中为OK,但对于较大的结构,它可能很乏味,所以我希望在某些情况下能够避免它.

types rust

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

如何以字节为单位获取指针偏移?

虽然Rust中的原始指针有offset方法,但这只会增加指针的大小.如何以字节为单位访问指针?

C中的这样的事情:

var_offset = (typeof(var))((char *)(var) + offset);
Run Code Online (Sandbox Code Playgroud)

rust

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

是否可以使用 rustdoc 对 API 的各个部分进行分组?

是否可以对 API 的各个部分进行分组?例如相关的函数、类型或常量。

例如,Doxygen 支持这样的分组

/** \name Some API Grouping
 * \{ */

// code //

/* \} */
Run Code Online (Sandbox Code Playgroud)

rustdoc 可以做类似的事情吗?

rust rustdoc

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

可以在*结构声明之后派生属性吗?

我正在使用宏来扩展原始结构:

pub struct MyTypedNumber(pub u32);
struct_impl_my_features!(MyTypedNumber);
Run Code Online (Sandbox Code Playgroud)

struct_impl_my_features宏可以实现的功能和特性MyTypedNumber,但是有这样的情况,它的使用非常有用#[derive(PartialEq, Eq)]-例如。

#[derive(...)]结构体已经声明后是否可以使用?

另一种方法是将结构定义作为item参数传递给宏:

struct_impl_my_features!(
    pub struct MyTypedNumber(pub u32);,
    MyTypedNumber
);
Run Code Online (Sandbox Code Playgroud)

这是有效的,所以它可能是最好的选择,虽然它相当笨重并且意味着声明和宏扩展必须在一起。

看到这个完整的例子,宏被调用struct_bitflag_impl(第二个例子)。


我通过手动实现PartialEqand解决了这个问题Eq,但是我遇到了需要 #[derive(...)]将Rust用作match语句中的常量的情况:

pub struct MyTypedNumber(pub u32);
struct_impl_my_features!(MyTypedNumber);
Run Code Online (Sandbox Code Playgroud)

macros rust

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

在 Rust 中使用 `macro_use` 时,如何将一些宏定义为模块的“私有”?

我有一个文件,其中包含 Rust 项目的共享宏。

由于我想在 crate 中(模块之间)重复使用宏,因此我使用#[macro_use].

在写宏的时候,我把一些共享的逻辑拆分成一个宏以避免重复,在这种情况下我不能使用私有函数,它需要是一个宏。如果可能,我想隐藏这个共享宏,这样其他模块就不能直接使用它。

有没有办法将一些宏设为私有,这样它们就不会通过 暴露给同一个板条箱中的其他模块#[macro_use]

macros namespaces rust

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

如何使用 Bresenham 的线条绘制算法进行剪裁?

当使用Bresenham 线绘制算法绘制一条线时,该线可能不在所写入位图的边界内 - 裁剪结果以使它们适合所写入图像的轴对齐边界会很有用。

虽然可以先将线条剪裁到矩形,然后再绘制线条。这并不理想,因为它通常会给线条稍微不同的倾斜度(假设正在使用 int 坐标)

由于这是一个如此原始的操作,是否有既定的方法可以在保持相同形状的同时剪切线?

如果有帮助,这里是该算法的参考实现- 它使用 int coords,避免在绘制线条时进行 int/float 转换。


我花了一些时间研究这个:

algorithm line rasterizing bresenham

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

如何在 Rust 中将空白/空参数传递给宏?

在某些情况下,您可能希望向宏传递一个参数,该参数要么是一些文本,要么什么都没有(空白,就好像什么也没写一样)。

鉴于这个起点:

macro_rules! testme {
    ($var:ident, $code:block) => {
        for i in 0..10 {
            let $var = i;
            { $code }
            if $var > 5 {
                println!("over 5");
            }
        }
    }
}

fn main() {
    testme!(myvar, {
        println!("{}", myvar);
    });

}
Run Code Online (Sandbox Code Playgroud)

我们可能希望选择var可变,假设宏体比上面的示例更大,最好不要复制整个宏。

macro_rules! testme {
    (private $var:ident, $code:block, $var_qual:tt) => {
        for i in 0..10 {
            // imagine this is a lot more code :)
            let $var_qual $var = i;
            { $code }
            if $var …
Run Code Online (Sandbox Code Playgroud)

macros rust

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

如何使浅的 git clone 保持最新(同时保持浅)

在某些情况下,存储整个 git 历史记录(例如构建机器人)没有用。

是否可以对 git 存储库(master例如,具有单个分支)进行浅层克隆,并使其保持最新状态,同时保持浅层?

git

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

运营商优先级和自动升级(避免溢出)

以字节为单位查找某些数据的大小是一种常见操作.

举例:

char *buffer_size(int x, int y, int chan_count, int chan_size)
{
    size_t buf_size = x * y * chan_count * chan_size;  /* <-- this may overflow! */
    char *buf = malloc(buf_size);
    return buf;
}
Run Code Online (Sandbox Code Playgroud)

这里明显的错误是int会溢出(例如23171x23171 RGBA字节缓冲区).

乘以3个或更多 值时,促销的规则是什么?
(乘以一对值很简单)

我们可以安全地播放它:

size_t buf_size = (size_t)x * (size_t)y * (size_t)chan_count * (size_t)chan_size;
Run Code Online (Sandbox Code Playgroud)

另一种方法是添加括号以确保乘法和促销的顺序是可预测的(并且对之间的自动促销按预期工作)......

size_t buf_size = ((((size_t)x * y) * chan_count) * chan_size;
Run Code Online (Sandbox Code Playgroud)

......哪个有效,但我的问题是.


是否存在确定性方法来乘以3个或更多值以确保它们会自动提升?
(以避免溢出)

或者这是未定义的行为?


笔记...

  • size_t在这里使用不会阻止溢出,它只是防止溢出该类型的最大值.
  • 在给出的例子中,让参数也可以是有意义的size_t,但这不是这个问题的重点.

c casting integer-promotion

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

如何使用指针算术获取向量中元素的索引?

在 C 中,您可以使用指针偏移量来获取数组中元素的索引,例如:

index = element_pointer - &vector[0];
Run Code Online (Sandbox Code Playgroud)

给定对数组中元素的引用,这在 Rust 中也应该是可能的。

虽然 Rust 能够从向量元素获取内存地址,将它们转换为usize,然后减去它们 - 在 Rust 中是否有更方便/惯用的方法来做到这一点?

pointers vector rust

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