私は少しこのような関数(playground)で始まった:`&[T]`を受け入れる関数を一般化して、それでもバイトリテラルで呼び出すことができますか?
fn find <T: Copy> (src: &[T], index: usize) -> T {
// more complex algorithm, involving src goes here
src[index]
}
pub fn main() {
let x = b"abc";
assert_eq!(b'b', find(x, 1));
}
そして私は、私は
src
のための任意の適切なタイプを使用できるように、それを一般化したかったです。私が思いついた最高のは、この(
playground)です:
find(&x[..], 1)
:
trait RandomAccess<T> {
fn get_at(&self, index: usize) -> T;
}
impl <T: Copy> RandomAccess<T> for [T] {
fn get_at(&self, index: usize) -> T {
self[index]
}
}
fn find <T: Copy, S: ?Sized + RandomAccess<T>> (src: &S, index: usize) -> T {
// more complex algorithm, involving src goes here
src.get_at(index)
}
pub fn main() {
let x = b"xyz";
assert_eq!(b'y', find(&x[..], 1));
}
しかし、私は今ちょうど私がスライスを作成する必要があり、find(x, 1)
を呼び出すことはできません。
これを汎用にする方法はありますか?元の例のようにfind
を呼び出すことはできますか?
最初の例の舞台裏でいくつかのトリッキーなことがあり、 '&[u8; 3]'を強制的に '&[u8]'にするようですが、2番目の例ではできませんこれが意図であることを確かめてください。それは基本的に問題ですか? –
私はインデックスと他のものを抽象化しようとしましたが、私はあなたがそのような抽象概念を全く導入する必要がないことを確信しています - 付加価値なしで物事を複雑にする傾向があります。他の 'src'タイプ' find() 'はどのようなものに適用できますか? –
ljedrz
トリッキーなのは、宛先タイプがわかっている場合に強制的にトリガすることです。 'find'は' src'に型パラメータを使用しているので、そうではありません。 – bluss