亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對于我不擁有的類型,我如何實現我不擁有的特性?

對于我不擁有的類型,我如何實現我不擁有的特性?

對于我不擁有的類型,我如何實現我不擁有的特性?我想實現Shl特征Vec,代碼在下面。這會使事情像vec << 4有可能,這是很好的糖vec.push(4).use std::ops::Shl;impl<T> Shl<T> for Vec<T> {     type Output = Vec<T>;     fn shl(&self, elem: &T) -> Vec<T> {         self.push(*elem);         *self     }}fn main() {     let v = vec![1, 2, 3];     v << 4;}編譯失敗,出現以下錯誤:無法提供在此機箱中未定義特征和類型的擴展實現[E 0117]或類型參數T必須用作某些本地類型的類型參數(例如,MyStruct<T>);只有當前機箱中定義的特征才能對類型參數[E 0210]實現。據我所知,我必須修補stdlib,更具體地說,collections::vec箱子。是否有另一種方法可以將此代碼更改為成功編譯?
查看完整描述

2 回答

?
楊__羊羊

TA貢獻1943條經驗 獲得超7個贊

雖然你不能完全做到這一點,但通常的解決方法是將你想要的類型封裝在你自己的類型中,并在此基礎上實現這個特性。

use somecrate::FooType;use somecrate::BarTrait;struct MyType(FooType);impl BarTrait for MyType {
    fn bar(&self) {
        // use `self.0` here
    }}


查看完整回答
反對 回復 2019-07-04
?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

這會使事情像vec << 4有可能,這是很好的糖vec.push(4).

雖然這是可以做到的,但它通常是一個餿主意若要實現具有意外語義的運算符,請執行以下操作。

下面是如何做到這一點的一個例子:

use std::ops::Shl;struct BadVec<T>(Vec<T>);impl<T> Shl<T> for BadVec<T> {
    type Output = BadVec<T>;

    fn shl(mut self, elem: T) -> Self::Output {
        self.0.push(elem);
        self
    }}fn main() {
    let mut v = BadVec(vec![1, 2, 3]);
    v = v << 4;
    assert_eq!(vec![1, 2, 3, 4], v.0)}

如果你實現Deref (DerefMut):

use std::ops::{Deref, DerefMut};impl<T> Deref for BadVec<T> {
    type Target = Vec<T>;

    fn deref(&self) -> &Self::Target {
        &self.0
    }}impl<T> DerefMut for BadVec<T> {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.0
    }}

你可以打電話Vec方法:

fn main() {
    let mut v = BadVec(vec![1, 2, 3]);
    v = v << 4;
    v.truncate(2);
    assert_eq!(2, v.len());}

看一下newtype_derive板條箱,它可以為你生成一些樣板代碼。


查看完整回答
反對 回復 2019-07-04
  • 2 回答
  • 0 關注
  • 519 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號