如何使用内联方法获得Ruby中的布尔值(我知道它被转换为0/1)的反面?
说我有给定的实例:
class Vote
def return_opposite
self.value
end
end
这显然没有做任何事情,但我似乎找不到像opposite()
之类的简单和简短的方法。这样的事情是否存在,我只是没有在文档中找到正确的位置?如果一个不存在,那么真正的短三元将从1 =>切换它。 0或0 => 1?
答案 0 :(得分:21)
0
或1
,实际上,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
如果 b 已经作为Ruby真或假条件有意义,那么它将很难被击败:
!b
这些示例在如何处理超出范围的输入方面有所不同......
答案 1 :(得分:18)
我喜欢用这个
@object.boolean = !@object.boolean
答案 2 :(得分:5)
最简单的方法是:
a ^= true
答案 3 :(得分:3)
如果您只想访问该值的反面,请使用!
,就像有些人在评论中所说的那样。如果您想实际更改该值,那将是bool_value = !bool_value
。除非我误解了你的问题。这很可能。
答案 4 :(得分:1)
如果你想切换布尔值(即false
和true
),那就像其他人所说的那样简单地使用!
。
如果你想在0
和1
之间切换,我只能想到一些天真的东西,如下所示:)
def opposite
op = {0=>1,1=>0}
op[self.value]
end
答案 5 :(得分:1)
我认为这基本上是对Ruby中布尔类(TrueClass和FalseClass)的疏忽。
你可以否定任何对象:
nil.! => true
false.! => true
true.! => false
0.! => false
1.! => false
a.! => false (all other objects)
但是你不能就地否定布尔对象:
a.!! => does not compile
我想这会给编译器的语法带来麻烦。
你能做的最好的事情就是:
a = a.!
答案 6 :(得分:1)
要在rails中切换布尔数据,您可以执行此操作vote.toggle!(:boolean)
答案 7 :(得分:0)
在Rails应用程序中,我使用此方法在暂停和活动之间切换帖子,所以! (不是)我的首选方法。
def toggle
@post = Post.find(params[:id])
@post.update_attributes paused: !@post.paused?
msg = @post.paused? ? 'The post is now paused.' : 'The post is now active.'
redirect_to :back, notice: msg
end
答案 8 :(得分:0)
我认为使用三元可能很有趣:
check = false
check == true ? check = false : check = true