Ruby:切换布尔内联?

时间:2010-01-17 02:04:29

标签: ruby

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

说我有给定的实例:

class Vote

  def return_opposite
    self.value
  end

end

这显然没有做任何事情,但我似乎找不到像opposite()之类的简单和简短的方法。这样的事情是否存在,我只是没有在文档中找到正确的位置?如果一个不存在,那么真正的短三元将从1 =>切换它。 0或0 => 1?

9 个答案:

答案 0 :(得分:21)

Ruby中的布尔表达式不是01,实际上,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)

如果你想切换布尔值(即falsetrue),那就像其他人所说的那样简单地使用!

如果你想在01之间切换,我只能想到一些天真的东西,如下所示:)

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