Ruby:切换布尔内联?

JP *_*shy 12 ruby

我如何使用内联方法得到Ruby中的布尔值(我知道它被转换为0/1)的反面?

说我有给定的实例:

class Vote

  def return_opposite
    self.value
  end

end
Run Code Online (Sandbox Code Playgroud)

这显然没有做任何事情,但我似乎找不到一种简单而简短的方法opposite().这样的事情是否存在,我只是没有在文档中找到正确的位置?如果一个不存在,是否有一个非常短的三元组,可以从1 => 0或0 => 1切换它?

Dig*_*oss 21

布尔表达式不是01在Ruby中,实际上0不是false

如果n是数字,我们交换0和1 ......

n == 0 ? 1 : 0 # or...
1 - n          # or...
[1, 0][n]      # or maybe [1, 0][n & 1] # or...
class Integer; def oh_1; self==0 ? 1:0; end; end; p [12.oh_1, 0.oh_1, 1.oh_1] # or...
n.succ % 2     # or...
n ^= 1
Run Code Online (Sandbox Code Playgroud)

如果b已经作为Ruby真或假条件有意义,那么它将很难被击败:

!b
Run Code Online (Sandbox Code Playgroud)

这些例子在如何处理超出范围的输入方面有所不同......


Rod*_*rek 18

我喜欢用这个

@object.boolean = !@object.boolean
Run Code Online (Sandbox Code Playgroud)


Chr*_*bek 5

编辑:请参阅下面@philomory 的评论。


我相信这基本上是 Ruby 中布尔类(TrueClass 和 FalseClass)的疏忽。

您可以否定任何对象:

nil.! => true
false.! => true
true.! => false
0.! => false
1.! => false
a.! => false (all other objects)
Run Code Online (Sandbox Code Playgroud)

但你不能就地否定布尔对象:

a.!! => does not compile
Run Code Online (Sandbox Code Playgroud)

我想这会给编译器的语法带来麻烦。

你能做的最好的事情就是:

a = a.!
Run Code Online (Sandbox Code Playgroud)

  • 虽然“a.!!”确实是一个语法错误,但其原因远比语法问题或“TrueClass”和“FalseClass”中的疏忽要深得多。变量不是对象,对象也不是变量;变量_name_对象(引用它们,保留它们,无论你想如何称呼它),而在给定范围内改变变量值的_唯一_事情就是赋值。如果“a.!!”不可能将不同的对象重新分配给“a”,那么它必须是“a”命名的对象的突变。但只有一个“真”,而且是一成不变的。(续) (2认同)

小智 5

最简单的方法是:

a ^= true
Run Code Online (Sandbox Code Playgroud)