gpt4 book ai didi

crystal-lang - Crystal Lang 中的 "&-="运算符是什么?

转载 作者:行者123 更新时间:2023-12-05 08:50:37 24 4
gpt4 key购买 nike

我刚刚了解到 Crystal 中存在 &-= 运算符。它有什么作用?

这是来自 Mutex#try_lock 的示例:

private def try_lock
i = 1000
while @state.swap(1) != 0
while @state.get != 0
Intrinsics.pause
i &-= 1
return false if i == 0
end
end

true
end

在尝试时,我看不出与熟悉的 -= 运算符有任何区别。例如,这两个片段产生相同的输出:

i = 1000
while i != 0
puts i
i -= 1
end
i = 1000
while i != 0
puts i
i &-= 1
end

最佳答案

拼图的第一步是要意识到 a &-= b只是 a = a &- b 的语法糖.或者更一般地说 a op= ba = a op b 的语法糖.语言引用在 Operators 中的“组合分配”下对此进行了详细说明。 .

现在我们需要问什么是&-它与 - 有何不同? ?不幸的是,API 文档对此非常安静。语言引用也不是很详细,但在与上面相同的 Operators 页面上我们可以找到:

- subtraction
&- wrapping subtraction

那么什么是环绕减法?好吧,Crystal 有固定大小的数字类型。所以在这种情况下它们可能会溢出或下溢。这意味着什么?让我们举个例子:

# We have something to sell! Let's keep track of how many!
# It doesn't really make sense to have negative something left,
# so an unsigned integer ought to this.
items_left = 2u32

# Just made the first sell! Let's remember
items_left -= 1

# People seem to actually like this
items_left -= 1

# I could do this all day!
items_left -= 1 # => Unhandled exception: Arithmetic overflow (OverflowError)

# Oh no what happend?

所以程序试图低于0 ,其中 UInt32类型无法表示。它下流了。如果 Crystal 不做这个检查,CPU 会很高兴地绕过整数类型,我们会得到 4294967295。在 items_left (UInt32::MAX)。

但有时,在低级代码中,这种行为正是我们想要的。例如,如果我们正在计算一些统计数据,比如发送的数据包,如果计数器溢出或下溢,我们不希望程序在这种情况下失败,回绕是可以的。或者我们可能有一些性能敏感的代码,并且确定它的行为正确并且永远不会溢出,所以我们不想在检查操作是否刚刚溢出时支付额外的 CPU 周期。

对于这些情况,有 &带前缀的数学运算符。它们只是简单地执行操作而不进行任何溢出检查。如果我们使用 &-而不是 -在上面的示例中,我们将有 4294967295items_left现在。

一般情况下,您知道是否需要包装运算符或从中受益。有疑问,就假装它们不存在。

关于crystal-lang - Crystal Lang 中的 "&-="运算符是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61434086/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com