Rust 如何指定希望泛型类型支持';新';

Rust 如何指定希望泛型类型支持';新';,rust,Rust,我想要一个可以从C调用的工厂方法 #[no_mangle] pub extern "C" fn make<T>() -> *mut T{ Box::into_raw(Box::new(T::new())) } #[无损坏] 发布外部“C”fn make()->*mut T T{ Box::into_raw(Box::new(T::new())) } 这不起作用,因为rust不知道t::new是否存在。我知道如果我想知道一个支持Rust定义

我想要一个可以从C调用的工厂方法

#[no_mangle]
pub extern "C" fn make<T>() -> *mut T{
        Box::into_raw(Box::new(T::new()))
}
#[无损坏]
发布外部“C”fn make()->*mut T T{
Box::into_raw(Box::new(T::new()))
}

这不起作用,因为rust不知道t::new是否存在。我知道如果我想知道一个支持Rust定义的Foo函数的类型,我会做出一个特性。< /P> < P>不像C++,它没有像模板级隐式接口那样的特性,所以必须明确地进行,比如

fn main() {
    make(|| Test::new);
}

pub fn make<T>(cl: impl Fn() -> T) -> *mut T
where {
        Box::into_raw(Box::new(cl()))
}

struct Test;

impl Test{
    fn new() -> Test {
        Test
    }
}
fn main(){
制作(| |测试::新建);
}
发布fn make(cl:impl fn()->T)->*mut T
在哪里{
Box::into_raw(Box::new(cl()))
}
结构测试;
impl试验{
fn new()->测试{
试验
}
}



除此之外,
no\u mangle
属性对于泛型函数没有用处。有关更多详细信息,请参阅相关的github。

新的
不是锈病的所谓“特征”,因为设计惯例是开放的;一些
new
构造函数接受参数,其他构造函数不接受参数,一些可能失败,其他构造函数是绝对正确的
new
纯粹是一个常规名称;否则,它在生锈方面没有显著价值。按照惯例,它们被称为
构造函数
,但这是一种正常的静态方法

您似乎在寻找的特性是
Default
,它是为创建一个新值(无需进一步参数)、创建一个合理的默认值(如数字
0
、布尔值
false
)或空集合等有意义的类型定义的

或者,如果您试图从单个参数转换,则您希望从转换的特性是:

#[no_mangle]
pub extern "C" fn make<T: Default>() -> *mut T{
    Box::into_raw(Box::new(T::default()))
}
#[无损坏]
发布外部“C”fn make()->*mut T T{
Box::into_raw(Box::new(T::default()))
}
或:

#[无损坏]
酒吧外部“C”fn make_from(x:x)->*mut T T{
Box::into_raw(Box::new(T::from(x)))
}
Type:Trait
约束告诉类型系统类型必须满足给定的Trait


如果你还不熟悉锈菌的特性,那么它们是锈菌编程中需要掌握的重要部分。

你所说的“新的已经存在”是什么意思?您必须为任何结构手动实现
new
;你不会自动得到它。我的意思是“new”函数是大多数类型已经实现的函数。我知道这只是惯例,但仍然如此。虽然不可调用的形式C。我只需要在我想上的课程上创造我自己的“新”特质和“impl for”。C#有“where t:new()”专门询问它是否有constructor@pm100无论怎样,
no\u mangle
对于泛型函数都没有用处。请看这是实际答案-请更新以便我可以勾选it@pm100更新了答案我熟悉这些特征。我不知道如何在这里创建一个(我把NullNew作为一个特征,但你不能不修改它们),当然我刚刚发现我不能不修改任何通用的东西。我必须为每种类型创建一个具体的函数,供您输入。我正处于“铁锈升级”阶段,每个评论和回答都告诉我一些新的东西
#[no_mangle]
pub extern "C" fn make_from<X, T: From<X>>(x: X) -> *mut T{
    Box::into_raw(Box::new(T::from(x)))
}