Просто интересно, что !!
есть в Ruby.
134
Нет нет. Он используется для преобразования значения в логическое значение:
!!nil #=> false
!!"abc" #=> true
!!false #=> false
Обычно это не нужно использовать, поскольку единственными ложными значениями для Ruby являются nil
и false
, поэтому обычно лучше оставить это соглашение в силе.
Думайте об этом как
!(!some_val)
Одна вещь, для которой он используется на законных основаниях - это предотвращение возврата огромного куска данных. Например, вы, вероятно, не хотите возвращать 3 МБ данных изображения в вашем has_image?
методе, или вы не хотите возвращать весь пользовательский объект в logged_in?
методе. Использование !!
преобразует эти объекты в простой true
/ false
.
.nil?
вместо использования!!
? Есть ли разница?!!true #=> true
иtrue.nil? #=> false
Возвращается,
true
если объекта справа нетnil
и нетfalse
,false
если он естьnil
илиfalse
источник
!
означает отрицание логического состояния, два!
s ничего особенного, кроме двойного отрицания.Обычно используется, чтобы заставить метод возвращать логическое значение. Он обнаружит любую правдивость, такую как строка, целые числа, а что нет, и превратит ее в логическое значение.
Более реальный вариант использования:
Это полезно, когда вы хотите убедиться, что логическое значение возвращается. ИМХО это вроде бессмысленно, хотя, видя , что оба ,
if 'some string'
иif true
точно такой же поток, но некоторые люди считают полезным явно возвращать логическое значение.источник
title
, можете также сделать самое близкое к этому ... Я полагаюОбратите внимание, что эта идиома существует и в других языках программирования. C не имеет встроенного
bool
типа, поэтому все логические значения были напечатаны какint
вместо, с каноническими значениями0
или1
. Возьмем этот пример (скобки добавлены для ясности):Синтаксис not-not преобразует любое ненулевое целое число
1
в каноническое логическое истинное значение.В целом, однако, я считаю, что гораздо лучше провести разумное сравнение, чем использовать эту необычную идиому:
источник
Это полезно, если вам нужно сделать эксклюзив или . Копирование ответа Мэтта Ван Хорна с небольшими изменениями:
Я использовал его, чтобы убедиться, что две переменные либо равны нулю, либо обе не равны нулю.
источник
Это «двойной негатив», но практика не приветствуется. Если вы используете rubocop , вы увидите, что он жалуется на такой код с
Style/DoubleNegation
нарушением.В обоснование состояния:
источник
!!false # => false
пока!false.nil? # => true
!(foo.nil? || foo == false)
- более многословно, да, но менее загадочно.Понимание того, как это работает, может быть полезно, если вам нужно преобразовать, скажем, перечисление в логическое значение. У меня есть код, который делает именно это, используя
classy_enum
гем:Тогда в сервисном коде у меня есть, например:
Фактически оператор bangbang стал тем, что я мог бы написать как метод to_bool.
источник