Rust中Self(rhs)与Self(lhs)含义及rhs、lhs来源解析
Rust
BitAnd示例中解构语法说明 示例中的BooleanVector是一个单字段元组结构体,包装了Vec<bool>类型,Self(rhs)和Self(lhs)都是Rust的 元组结构体模式解构 语法,不存在特殊逻辑,作用是直接从结构体实例中拆出内部包装的字段,绑定到指定变量上。
Self(rhs)的含义与作用
Self是impl块内的关键字别名,固定指代当前正在实现trait的类型,这里等价于BooleanVector。- 这行出现在
bitand方法的参数列表中,属于 参数位置的模式解构:
方法的第二个参数类型为Self(即BooleanVector实例,对应按位与运算符&的右侧操作数),我们没有将整个结构体实例绑定为参数变量,而是直接在参数位用元组结构体的解构规则,把实例内部唯一的Vec<bool>字段拆出来,绑定给名为rhs的局部变量。 - 这种写法省掉了手动访问元组结构体序号字段(即
rhs.0)的步骤,代码更简洁。
Self(lhs)的含义与作用
- 这行出现在方法体内的
let语句中,属于 let绑定位置的模式解构:self是bitand方法的接收者,对应&运算符的左侧操作数,类型同样是Self。这行代码直接对self做模式匹配,把其内部包装的Vec<bool>字段拆出来,绑定给名为lhs的局部变量,效果和参数位解构完全一致。
rhs与lhs的定义来源
两个变量都没有提前单独声明,完全是上述两处解构语法生成的局部变量:
rhs:是right-hand side(右侧操作数)的缩写,来自第二个参数的解构,对应&运算符右侧BooleanVector实例内部的Vec<bool>lhs:是left-hand side(左侧操作数)的缩写,来自对self的let解构,对应&运算符左侧BooleanVector实例内部的Vec<bool>
如果把解构语法替换成最直白的普通写法,bitand方法的逻辑和原代码完全等价,可以对照理解:
fn bitand(self, rhs_param: Self) -> Self::Output { let lhs = self.0; // 手动取self内部的第一个字段 let rhs = rhs_param.0; // 手动取参数内部的第一个字段 assert_eq!(lhs.len(), rhs.len()); Self( lhs.iter() .zip(rhs.iter()) .map(|(x, y)| *x & *y) .collect() ) }
内容的提问来源于stack exchange,提问作者lijeles952
相关产品推荐
相关产品推荐

