我如何使用内联方法得到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
0或1在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)
这些例子在如何处理超出范围的输入方面有所不同......
编辑:请参阅下面@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)