我需要用Go和Rust重写这些C声明,以解决我正在处理的一系列实践问题。我想出了围棋部分,但我对铁锈部分有困难。有什么想法或帮助写这些铁锈吗?
发布于 2014-12-02 05:30:18
假设n是一个常量:
let a: [*mut f64, ..n]; // double *a[n];
let b: *mut [f64, ..n]; // double (*b)[n];
let c: [fn() -> f64, ..n]; // double (*c[n])();
fn d() -> *mut [f64, ..n]; // double (*d())[n];在任何语言中,这些都是相当尴尬和不寻常的类型。然而,铁锈的语法使这些声明比C的语法更易于阅读。
注意,C中的d是一个函数声明。在Rust中,只允许在extern块中声明外部函数(参见FFI指南)。
发布于 2014-12-02 05:22:57
答案取决于*到底是干什么用的。例如,第一个被用作指向double的指针数组,还是double的数组?指针是否为空?
另外,n是一个常数还是非常数?如果是,则需要一个数组;如果不是,则需要一个Vec。
此外,这些是全局声明还是本地声明?它们是函数论点吗?每种方法都涉及不同的语法。
坦率地说,没有更多的上下文,就不可能准确地回答这个问题。相反,我会给你以下几点:
n,否则它将不会解析。f32和f64,这取决于您是在使用float还是double。另外,不要被捕捉到:int in Rust 并不等同于C中的int。更喜欢显式大小的类型,比如i32或u64,或者来自libc的类型,比如c_int。int和uint应该只使用和显式指针大小的值。T的引用编写为&T或&mut T,这取决于所需的可更改性(C中的默认值是可变的,默认的是Rust是不可变的)。Option<&T>。double的数组”将是[f64],大小的n数组将为[f64, ..n]。但是,通常情况下,C中的double[]的实际等效值是&[f64];也就是说,是对数组的引用,而不是数组的实际内容。T的指针是*const T还是*mut T,这取决于它是指向常量数据还是可变数据的指针。fn (Args...) -> Result编写的。因此,一个不需要任何东西并返回一个double的函数就是fn () -> f64。https://stackoverflow.com/questions/27242122
复制相似问题