Rust 这条奇怪的线是干什么的?
已经对Rust编译器进行了新的测试。它验证是否可以编译奇怪的行:Rust 这条奇怪的线是干什么的?,rust,deobfuscation,Rust,Deobfuscation,已经对Rust编译器进行了新的测试。它验证是否可以编译奇怪的行: fn main() { let val = !((|(..):(_,_),__@_|__)((&*"\\",'@')/**/,{})=={&[..=..][..];})// ; assert!(!val); } 这条线到底是干什么的?让我们把它分解一下!首先,我重新设置了行的格式,以在某种程度上增加“可读性” 它以let val=开头,以//结尾。这是一个简单的let绑定,形式为let v
fn main() {
let val = !((|(..):(_,_),__@_|__)((&*"\\",'@')/**/,{})=={&[..=..][..];})//
;
assert!(!val);
}
这条线到底是干什么的?让我们把它分解一下!首先,我重新设置了行的格式,以在某种程度上增加“可读性” 它以
let val=
开头,以//结尾代码>。这是一个简单的let绑定,形式为let val=⟨v⟩;代码>。让我们讨论一下⟨v⟩代码>是否:
- 通过not运算符进行否定:
!( ⟨_⟩ )代码>
- 通过
==
:⟨lhs⟩ == ⟨rhs⟩代码>
- ⟨lhs⟩:闭包的函数调用
(⟨关闭⟩ )( ⟨args⟩ )代码>
- ⟨关闭⟩:闭包定义
|⟨第一参数⟩, ⟨第二参数⟩| ⟨身体⟩代码>
- ⟨第一参数⟩:
(..):(?,?)
。此参数有一个类型注释(?,?)
,表示它是一个2元组。模式(通常,您会找到一个名称)是(..)
,这意味着:一个元组,但忽略它的所有元素
- ⟨第二参数⟩:
。
。这是一种通常从匹配绑定中知道的模式:name@pattern
。因此实际模式是。
(它不绑定任何内容),值通过@
绑定到名称。
(两个下划线,这是一种有效标识符)
- ⟨身体⟩:
\uuuuuu
。这正是我们将第二个参数绑定到的标识符。因此闭包基本上等同于\uux,x
- ⟨args⟩:两个参数的列表,中间有一个内联注释:
⟨第一个参数⟩/**/, ⟨第二个参数⟩代码>
- ⟨第一个参数⟩:
(&*“\\”,“@')
。这只是一个2元组,其中第一个元素是一个包含反斜杠的字符串,第二个元素是char“@”
。第一个元素的&*
将取消
- ⟨第二个参数⟩:
{}
。这是一个类型为()
的空块。因此,作为第二个参数,传递一个单位
- ⟨rhs⟩:内有一条语句的大括号块:
{⟨stmt⟩; }代码>。请注意,这是一条带有分号的语句。这意味着结果不是从块返回的。相反,块返回的()
,与空块{}
一样。
- ⟨stmt⟩:索引表达式
{&⟨收集⟩[⟨指数⟩] }代码>。
- ⟨收集⟩:
[..=..]
。这是一个包含一个元素的数组。元素为。=..
,其中范围的结尾是写入的。
- ⟨指数⟩:
。
。这又是满量程
总之:我们将调用闭包的结果与计算结果为()
的带括号块进行比较。闭包基本上是|,x | x
,我们传递给它的第二个参数是{}
(计算结果为()
),因此整个闭包调用表达式的计算结果为
这意味着整个过程相当于:
让val=!(()=);
,这相当于:
让val=!(true);
,相当于:
让val=false;
值得一读的函数名有zombiejesus
和evil\u lincoln
。
let val = !(
(
|(..): (_, _), __@_| __
)(
(
&*"\\",
'@'
) /**/,
{}
)
==
{
&[..=..][..];
}
)//
;