遍历值
Series本身是动态类型变量。如果编程时类型未知,则必须使用Series:iter()迭代器,它会返回AnyValue封装后的值,封装和解包会产生性能损失。尽量避免返回AnyValue的API。
底层类型未知
#![allow(unused)] fn main() { let s = Series::new("foo".into(), [1i32 ,2, 3]); let s_squared: Series = s.iter() .map(|opt_v| { match opt_v { AnyValue::Int32(x) => Some(x*x), //可以添加不同类型的处理逻辑。 _ => None, } }).collect(); }
底层类型已知
如果底层类型已经知晓,可以用i8() i16() i32() i64() f32() f64() u8() u16() u32() u64() bool() str() binary() decimal() list()这些向下转型函数,取出Series底层的Chunkedarray<T>引用。类型解析操作只是对底层的Chunkedarray<T>引用做了类型转换,并不会复制一份数据。另外你需要自己保证调用的解析函数和底层的T类型一致,否则会出现运行时错误。
s.i32()?.iter()生成对应的迭代器。
#![allow(unused)] fn main() { let s = Series::new("foo", [1i32 ,2, 3]); let s_squared: Series = s.i32()?.iter() .map(|opt_v| { match opt_v { Some(v) => Some(v * v), None => None, // null value } }).collect(); }