ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

rust 变参

2022-07-16 18:00:48  阅读:136  来源: 互联网

标签:变参 Args assert idxs Row ROW rust SIZE


#[derive(Clone, Copy)]
enum Args<'a> {
    Idx(usize),
    IdxList(&'a [usize]),
}

fn get_data<'a, T>(arr: &'a [T], idxs: Args<'a>) -> Vec<&'a T> {
    match idxs {
        Args::Idx(idx) => vec![&arr[idx]],
        Args::IdxList(idxs) => idxs.iter().map(|&idx| &arr[idx]).collect(),
    }
}

fn main() {
    let a = ["zhihu", "baidu", "360", "996"];
    assert!(get_data(&a, Args::Idx(1)) == vec![&a[1]]);
    assert!(get_data(&a, Args::IdxList(&[1, 2, 3])) == vec![&a[1], &a[2], &a[3]]);
}

可以这样实现。对于这种多下标访问的,更常见处理方式的是使用变参宏实现,比如以下这个库

https://github.com/rodrimati1992/multindex

use multindex::multindex;

const ROW_SIZE: usize = 5;

let array: [u16; ROW_SIZE * 4] = [
    1, 2, 3, 5, 8,
    13, 21, 34, 55, 89,
    144, 233, 377, 610, 987,
    1597, 2584, 4181, 6765, 10946,
];


type Row = [u16; ROW_SIZE];
// The type annotation is for the reader, the type can be inferred.
let (row0, row1, row2, row3): (&Row, &Row, &Row, &Row) =
    multindex!(array; ..ROW_SIZE, ..ROW_SIZE * 2, ..ROW_SIZE * 3, ..ROW_SIZE * 4);

assert_eq!(row0, &[1, 2, 3, 5, 8]);
assert_eq!(row1, &[13, 21, 34, 55, 89]);
assert_eq!(row2, &[144, 233, 377, 610, 987]);
assert_eq!(row3, &[1597, 2584, 4181, 6765, 10946]);

  

标签:变参,Args,assert,idxs,Row,ROW,rust,SIZE
来源: https://www.cnblogs.com/pythonClub/p/16484806.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有