Le double bang en Ruby
Ou encore !!, ou double point d’exclamation
On peut voir ici ou là ce genre de code Ruby:
!!expression
-C’est un truc qui n’est d’ailleurs pas spécifique au langage Ruby- Pourquoi voudrait-on écrire ça ?
Le ! (not) fait une négation booléenne. Donc si une expression est true,
cela va donner false, et inversement, si une expression est false, cela
va donner true. Exemple:
$ irb
>> !true
=> false
>> !false
=> trueDonc le !! est la négation booléenne d’une négation booléenne! Hum, ça
a l’air un peu inutile, hein:
>> !!true
=> true
>> !!false
=> falseCe qu’il ne faut pas oublier, c’est qu’en Ruby, comme dans plein d’autres
langages, beaucoup de choses peuvent être true ou false.
La preuve pour true:
>> puts 'ok' if 'kind of true value'
ok
puts 'ok' if [1, 2]
ok
>> puts 'ok' if []
okEn fait, toute valeur autre que false ou nil est considérée comme true.
Et le corollaire: sont considérées comme false les valeurs false ou nil.
On peut maintenant voir l’intérêt du !!. Soit la classe suivante pour nous
servir d’exemple:
class Connection
def initialize(connection = nil)
@connection = connection
end
# Returns a boolean.
def connected?
!!@connection
end
endBien que @connection soit nil ou un objet quelconque, je veux que
connected? renvoit true ou false. Pour ça je peux écrire:
if @connection
true
else
false
end
ou bien encore:
@connection ? true : false
Mais le !!@connection fonctionne tout aussi bien. Il est plus concis, et
surtout exprime bien le cast en booléen:
>> c1 = Connection.new
=> #<Connection:0x9236910 @connection=nil>
>> c1.connected?
=> false
>> c2 = Connection.new(Object.new)
=> #<Connection:0x922deb4 @connection=#<Object:0x922dec8>>
>> c2.connected?
=> trueÀ demain.