2017-01-25 9 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' черты. Затем вы можете ограничить общие типы в своей функции. – squiguy

ответ

5

Характеристика Into - это то, что вы хотите. Объявить функцию, чтобы взять Into<Cow<'a, [T]>> и вызвать метод 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', после того как вы его затеняете, вы не можете его случайно ссылаться. –