3 回答
TA贡献2021条经验 获得超8个赞
|=读取的方式与+=。
notification.defaults |= Notification.DEFAULT_SOUND;
是相同的
notification.defaults = notification.defaults | Notification.DEFAULT_SOUND;
其中|是逐位OR运算符。
这里引用所有运算符。
使用逐位运算符是因为,通常,这些常量使int能够携带标志。
如果你看一下这些常数,你就会发现它们的权力是两个:
public static final int DEFAULT_SOUND = 1;
public static final int DEFAULT_VIBRATE = 2; // is the same than 1<<1 or 10 in binary
public static final int DEFAULT_LIGHTS = 4; // is the same than 1<<2 or 100 in binary
因此,您可以使用按位OR来添加标志
int myFlags = DEFAULT_SOUND | DEFAULT_VIBRATE; // same as 001 | 010, producing 011
所以
myFlags |= DEFAULT_LIGHTS;
只是意味着我们添加一个标志。
并且对称地,我们使用&以下方法测试标志:
boolean hasVibrate = (DEFAULT_VIBRATE & myFlags) != 0;
TA贡献1825条经验 获得超4个赞
我正在寻找关于|=Groovy中的内容的答案,尽管上面的答案是正确的,但它们并没有帮助我理解我正在查看的特定代码片段。
特别是,当应用于布尔变量时,“| =”将在第一次遇到右侧的truthy表达式时将其设置为TRUE,并且对于所有| =后续调用将保持其TRUE值。像一个闩锁。
这是一个简单的例子:
groovy> boolean result
groovy> //------------
groovy> println result //<-- False by default
groovy> println result |= false
groovy> println result |= true //<-- set to True and latched on to it
groovy> println result |= false
输出:
false
false
true
true
编辑:为什么这有用?
考虑一种情况,您想知道各种对象上是否有任何更改,如果是,请通知其中一个更改。所以,你要设置一个hasChanges布尔值并将其设置为 |= diff (a,b)然后|= dif(b,c)等。这是一个简短的例子:
groovy> boolean hasChanges, a, b, c, d
groovy> diff = {x,y -> x!=y}
groovy> hasChanges |= diff(a,b)
groovy> hasChanges |= diff(b,c)
groovy> hasChanges |= diff(true,false)
groovy> hasChanges |= diff(c,d)
groovy> hasChanges
Result: true
添加回答
举报