Skip to content

Latest commit

 

History

History
83 lines (56 loc) · 3.3 KB

ruby-kogda-ispolzuetsya-dvoynoe-otritsanie.md

File metadata and controls

83 lines (56 loc) · 3.3 KB

Ruby: Когда используется двойное отрицание (!!)

Пример использования:

def time?(string)
!!(string =~ /\d+:\d+/)
end

Такой метод вернет true, если переданная строка похоже на время в формате часы и минуты (например, 18:30) и вернет false в обратном случае.

«Истинноподобные» значения

if true
puts "It's working!"
end

Выведет на экран It's working!.

То же самое будет, если вместо true поставить что угодно, кроме nil или false. Любое выражение, которое приводит к тому, что руби считает его как бы истиной при подстановке в условие (и выполняет действие) в этой ветке, называется «истинноподобным».

То есть в ruby всё, кроме этих двух объектов является «истинноподобными» значениями.

Отрицание

Мы знаем, что ! — это отрицание. Если в a лежит число 2, то a == 2 вернет true, а !(a == 2) вернет false.

То есть оператор ! берет выражение, которое стоит после него и возвращает для него false, если это выражение истинноподобное и true в обратном случае.

> !(a == 2)
=> false

Если записать результат работы оператора ! в переменную и снова вызвать его отрицание, то получится так:

> x = !(a == 2)
> !x
=> true

Двойное отрицание

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

Примеры:

> !!true
=> true

> !!false
=> false

> !!nil
=> false

> !!0
=> true

> !!'string'
=> true

> !!5.3
=> true

> !![0, 1, 2]
=> true

> !!{key: 'value'}
=> true

Когда мы используем перед объектом или выражением двойное отрицание, мы как бы проявляем «булевскую суть» объекта или выражения, в примере, с которого мы начали мы делаем это, чтобы метод соответствовал конвенции (методы, оканчивающиеся на вопросительный знак должны возвращать true или false) и избежать странных ситуаций, когда мы могли бы начать использовать возвращаемое значение как число или nil.

Ещё про двойные отрицания:

https://ru.stackoverflow.com/questions/188946/Двойное-отрицание