在结构中使用原始点时,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,但对于较大的结构,它可能很乏味,所以我希望在某些情况下能够避免它.
虽然Rust中的原始指针有offset方法,但这只会增加指针的大小.如何以字节为单位访问指针?
C中的这样的事情:
var_offset = (typeof(var))((char *)(var) + offset);
Run Code Online (Sandbox Code Playgroud) 是否可以对 API 的各个部分进行分组?例如相关的函数、类型或常量。
例如,Doxygen 支持这样的分组:
/** \name Some API Grouping
 * \{ */
// code //
/* \} */
Run Code Online (Sandbox Code Playgroud)
rustdoc 可以做类似的事情吗?
我正在使用宏来扩展原始结构:
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) 我有一个文件,其中包含 Rust 项目的共享宏。
由于我想在 crate 中(模块之间)重复使用宏,因此我使用#[macro_use].
在写宏的时候,我把一些共享的逻辑拆分成一个宏以避免重复,在这种情况下我不能使用私有函数,它需要是一个宏。如果可能,我想隐藏这个共享宏,这样其他模块就不能直接使用它。
有没有办法将一些宏设为私有,这样它们就不会通过 暴露给同一个板条箱中的其他模块#[macro_use]?
当使用Bresenham 线绘制算法绘制一条线时,该线可能不在所写入位图的边界内 - 裁剪结果以使它们适合所写入图像的轴对齐边界会很有用。
虽然可以先将线条剪裁到矩形,然后再绘制线条。这并不理想,因为它通常会给线条稍微不同的倾斜度(假设正在使用 int 坐标)。
由于这是一个如此原始的操作,是否有既定的方法可以在保持相同形状的同时剪切线?
如果有帮助,这里是该算法的参考实现- 它使用 int coords,避免在绘制线条时进行 int/float 转换。
我花了一些时间研究这个:
在某些情况下,您可能希望向宏传递一个参数,该参数要么是一些文本,要么什么都没有(空白,就好像什么也没写一样)。
鉴于这个起点:
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) 在某些情况下,存储整个 git 历史记录(例如构建机器人)没有用。
是否可以对 git 存储库(master例如,具有单个分支)进行浅层克隆,并使其保持最新状态,同时保持浅层?
以字节为单位查找某些数据的大小是一种常见操作.
举例:
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 中,您可以使用指针偏移量来获取数组中元素的索引,例如:
index = element_pointer - &vector[0];
Run Code Online (Sandbox Code Playgroud)
给定对数组中元素的引用,这在 Rust 中也应该是可能的。
虽然 Rust 能够从向量元素获取内存地址,将它们转换为usize,然后减去它们 - 在 Rust 中是否有更方便/惯用的方法来做到这一点?