2016-06-13 16 views
1

APIのどこかで私は引数として&[&A]を取る関数を持っていますが、ベクトルはAというオブジェクトしかありません。Rustのベクトルからリファレンスのスライスを取得する方法は?

let a = &v[&..] 

:私は成功せず、しかし、いくつかの試みを行っている

<anon>:12:9: 12:10 error: mismatched types: 
expected `&[&A]`, 
    found `&[A]` 
(expected &-ptr, 
    found struct `A`) [E0308] 

:私は following syntax

pub struct A(pub u64); 

fn test(a: &[&A]){} 

fn main() { 
    let v = vec![A(1), A(2), A(3)]; 
    let a = &v[..]; 
    test(a); 
} 

でこの機能を使用しようとすると、私はエラーを持っています

let a = &v[&A] 

&[&A]Vec<A>にするにはどうすればいいですか?

+1

短い回答:できません。これらのタイプは互いに互換性がありません。 – mcarton

+0

さて、興味深いのは、私が使っているAPIの機能が、この種の引数を持っている場合、どのように機能するのでしょうか? –

+1

これが本当にAPIが必要とするものなら、あなたができることは 'test(&v.iter()。collect :: >());'です。しかし、これは新しいベクトルを割り当てます。あなたがAPIの作者であれば、それを変更することを検討してください: '[&T]'はあなたがスライスとその中のオブジェクトに異なる所有者を必要とするので、動作する奇妙な型です。 '&[T]'はすでに内部オブジェクトの参照渡しの意味を持っています。 – mcarton

答えて

2

短い回答:できません。これらのタイプは互いに互換性がありません。これがあれば、あなたが何ができるか

は本当に何APIが必要なのは

test(&v.iter().collect::<Vec<_>>()); 

である。しかし、これは新しいベクトルを割り当てます。あなたがAPIの作者であれば、それを変更することを検討してください:&[&T]は、スライスとその中のオブジェクトに異なる所有者が必要なので、動作する奇妙なタイプです。 &[T]にはすでに内部オブジェクトの参照渡しの意味があります。

+0

または、 '&[U]'を 'どこU:AsRef 'と指定してください。 – Shepmaster

+0

@Shepmasterこれが役に立つと思われる具体的な例がありますか?私が考えることができる '&[&T]'の唯一の使い方は '&[& 'static str]'です。 – mcarton

+1

私が考えることができるのは、形質オブジェクトへの参照です: '&[&Display]'。 APIによっては、下位互換性も維持する必要があります。 – Shepmaster

関連する問題