2015-02-07 28 views
3

可变性是性状中的一个通用参数吗?我想实现类型的可变和不可变变体的特性,而不必复制&粘贴impl块。如何实现任何可变性的特质?

 
trait Foo<T> {…} 

impl<T> Foo for *const T {…} 
impl<T> Foo for *mut T {…same thing again…} 

一厢情愿的伪代码:

 
trait Foo<T> {…} 

impl<T, Mutability> Foo for *Mutability T {…} 
+0

作为一种解决方法,您可以定义一个私有宏来生成两个impls,或者您可以将一个变体的实现转换为另一个具有强制转换的实现:* const T'实现,然后将'* mut T'的impl定义为'(self as * const T).method()'或类似的东西。 – delnan 2015-02-07 22:44:13

+0

铸造可能是我见过最多的解决方案;我想我甚至已经看到人们只有在明确需要的时候才会保存'* const T'指针并将其转换为'* mut T'。更一般地说,人们希望能够*返回参数化的可变性,以及改变引用'&T'的可变性'&mut T'。在这些情况下,我会非常谨慎地施放或转化。 – Shepmaster 2015-02-07 22:50:46

回答

5

可以易变性在性状的泛型参数?

号^ _^

下面是关于此事(ForumReddit)一些详细的讨论。

我认为一般人都认为目前的状态并不理想,但目前它也不是非常有限。关于它将如何实施以及各种方法的合理性存在担忧。有些人怀疑高等金属类型(HKTs)是否可以解决问题,如果它们被添加到Rust的话。