我想在0和1之间切换一个变量。如果是0,我就设它为1,如果是1,我就设它为0。
这是一个非常基本的运算,我经常写,我想研究一下最短,最清晰的方法。这是我目前为止最好的:
v = (v == 0 ? 1 : 0);
你能改进一下吗?
编辑:这个问题问的是如何在保持清晰的情况下用最少的字符写出上面的语句——为什么这“不是一个真正的问题”?这并不是一个代码-高尔夫练习,尽管一些有趣的答案来自于把它当作高尔夫的人——很高兴看到高尔夫以一种建设性和发人深省的方式被使用。
我想在0和1之间切换一个变量。如果是0,我就设它为1,如果是1,我就设它为0。
这是一个非常基本的运算,我经常写,我想研究一下最短,最清晰的方法。这是我目前为止最好的:
v = (v == 0 ? 1 : 0);
你能改进一下吗?
编辑:这个问题问的是如何在保持清晰的情况下用最少的字符写出上面的语句——为什么这“不是一个真正的问题”?这并不是一个代码-高尔夫练习,尽管一些有趣的答案来自于把它当作高尔夫的人——很高兴看到高尔夫以一种建设性和发人深省的方式被使用。
当前回答
因为这是JavaScript,我们可以使用一元的+转换为int:
v = +!v;
这将在逻辑上不是v的值(如果v == 0则为真,如果v == 1则为假)。然后我们将返回的布尔值转换为相应的整数表示。
其他回答
我会说得更清楚一点。
v是什么意思?
例如v是某种状态。创建对象Status。在DDD中是一个值对象。
在这个值对象中实现逻辑。这样你就可以以更实用的方式编写代码,从而更易于阅读。切换状态可以在当前状态的基础上创建一个新的status。然后,你的if语句/逻辑被封装在你的对象中,你可以单元测试。valueObject总是不可变的,所以它没有标识。为了改变它的值,你必须创建一个新的。
例子:
public class Status
{
private readonly int _actualValue;
public Status(int value)
{
_actualValue = value;
}
public Status(Status status)
{
_actualValue = status._actualValue == 0 ? 1 : 0;
}
//some equals method to compare two Status objects
}
var status = new Status(0);
Status = new Status(status);
如果你不关心除1以外的任何可能性
v = v ? 0 : 1;
在上述情况下,如果v为0、false、undefined或null, v将最终为1。注意使用这种方法-即使v是"hello world", v也将为0。
另一种创造性的方法是,v等于任何值,总是返回0或1
v = !!v^1;
如果它必须是整数1或0,那么你这样做是好的,尽管括号是不需要的。如果这些a被用作布尔值,那么你可以这样做:
v = !v;
你可以为它写一个函数,并像这样使用它:
v = inv(v)