Пример использования:
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/Двойное-отрицание