Рубин: включить булеву строку? - PullRequest
12 голосов
/ 17 января 2010

Как я могу получить противоположное логическое значение в Ruby (я знаю, что он преобразуется в 0/1), используя метод inline?

скажи, что у меня есть данный экземпляр:

class Vote

  def return_opposite
    self.value
  end

end

Который, очевидно, ничего не делает, но я не могу найти метод, который является простым и коротким, например, opposite() или тому подобное. Существует ли что-то подобное, и я просто не смотрю в нужном месте в документах? Если кто-то не существует, существует ли действительно короткая тройка, которая бы переключала его с 1 => 0 или 0 => 1?

Ответы [ 8 ]

21 голосов
/ 17 января 2010

Булевы выражения не 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

Если b уже имеет смысл как Ruby истинное или ложное условное выражение, его будет трудно победить:

!b

Эти примеры отличаются тем, как они обрабатывают ввод за пределами диапазона ...

18 голосов
/ 06 сентября 2014

Мне нравится использовать это

@object.boolean = !@object.boolean
5 голосов
/ 22 декабря 2015

Самый простой способ сделать это:

a ^= true
3 голосов
/ 17 января 2010

Если вы просто хотите получить противоположное значение, используйте !, как говорили некоторые люди в комментариях. Если вы хотите изменить значение, это будет bool_value = !bool_value. Если я не понял ваш вопрос. Что вполне возможно.

1 голос
/ 21 января 2016

Чтобы переключить логические данные в рельсах, вы можете сделать это vote.toggle!(:boolean)

1 голос
/ 21 января 2015

Я считаю, что это в основном недосмотр в булевых классах (TrueClass и FalseClass) в Ruby.

Вы можете отрицать любой объект:

nil.! => true
false.! => true
true.! => false
0.! => false
1.! => false
a.! => false (all other objects)

Но вы не можете на месте отрицать логические объекты:

a.!! => does not compile

Полагаю, это вызовет проблемы с грамматикой компилятора.

Лучшее, что вы можете сделать, это:

a = a.!
1 голос
/ 17 января 2010

Если вы хотите переключить логическое значение (то есть false и true), это будет так же просто, как просто использовать !, как заявили другие.

Если вы хотите переключиться между 0 и 1, я могу думать только о чем-то наивном, как показано ниже:)

def opposite
     op = {0=>1,1=>0}
     op[self.value]
end
0 голосов
/ 05 октября 2013

В приложении на 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...