2017-01-25 5 views
1

は交換すること、APIがCow<[sometype]>を使用するように移動する場合:スライス/ベクトルを関数の引数で 'Cow <[type]>'に強制することはできますか?

some_func(arg1, arg2, arg3); 

で:

some_func(Cow::from(&arg1[..]), Cow::from(&arg2[..]), Cow::from(&arg3[..])); 

はかなり密な構文です。

関数の引数として渡されたときに、ベクトルまたはスライスをCowに等価にすることはできますか?


これを行うにはない正当な理由があるかもしれませんあなたが関数に何回も同じ引数を使用した場合、例えば、明示的な構文はCow<[]>バージョンは変数を割り当てて保管しなければならないヒントです。しかし、これが可能かどうかを知りたいと思っています。

+3

Into<Cow<'a, [T]>>を取ると機能でinto()メソッドを呼び出すための関数を宣言します。関数内のジェネリック型を制約できます。 – squiguy

答えて

5

Into特性はあなたが望むものです。私はあなたが `Into`の特性に興味があるかもしれないと思う

use std::borrow::Cow; 

fn foo<'a, T: Into<Cow<'a, [u8]>>>(v: T) { 
    let x = v.into(); 
    println!("{:?}", x); 
} 

fn main() { 
    let v = vec![0,1,2]; 
    let s = &[3,4,5]; 
    foo(v); 
    foo(&s[..]); 
} 

Playground

+2

注:これはシャドーイングが本当に興味深い場所です。引数 'x'の名前を変更してシャドーイングした後に、それを誤って参照することはできません。 –

関連する問題