23
octobre
2007
HAML surcharge NilClass : nil > 42 == true
octobre
2007
Et oui, c’est à mon grand étonnement que je viens de me rendre compte que pour Rails, nil était supérieur à tout ce qui peut exister…
Extrait de la console Rails :
>> nil > 42
=> true
>> nil > 'aaaaa'
=> true
>> nil > Time.now
=> true
D’autant plus étrange que Ruby ne voit pas les choses du même œil.
Extrait d’IRB :
irb(main):001:0> nil > 42
NoMethodError: undefined method `>' for nil:NilClass
from (irb):1
irb(main):002:0> nil > 'aaaaa'
NoMethodError: undefined method `>' for nil:NilClass
from (irb):2
irb(main):003:0> nil > Time.now
NoMethodError: undefined method `>' for nil:NilClass
from (irb):3
Edit :
Après quelques recherches, il s’avère que c’est le plugin HAML qui surcharge NilClass, en faisant un include Comparable :
class NilClass # :nodoc:
include Comparable
def <=>(other)
other.nil? ? 0 : 1
end
end
Méfiance donc pour ce genre de comportements qui peuvent entrainer d’étranges résultats.
3 Commentaires + Ajouter un commentaire
Articles récents
Commentaires récents
- HAML surcharge NilClass : nil > 42 == true dans
- 60 jours pour télécharger « Build Your Own Ruby on Rails Web Applications » gratuitement dans
- 60 jours pour télécharger « Build Your Own Ruby on Rails Web Applications » gratuitement dans
- ActiveRecord : faire démarrer les enregistrements à un index défini dans
- ActiveRecord : faire démarrer les enregistrements à un index défini dans
En regardant récemment dans le code d’HAML, je me suis rendu compte que la surcharge de NilClass a été supprimée depuis la version 1.7.2
On retrouve le comportement habituel :
>> nil > 42
NoMethodError: You have a nil object when you didn’t expect it!
The error occurred while evaluating nil.>
Il ne reste plus qu’a se mettre à jour
Après quelques recherches, il s’avère que ce comportement étrange est dû à HAML, qui surcharge NilClass :
class NilClass # :nodoc:
include Comparable
def (other)
other.nil? ? 0 : 1
end
end
c’est vachement bizarre, tu as un peu cherché le pourquoi du comment ?