nil n'est pas l'absence d'objet. C'est un objet bien présent.nil is not the absence of an object. It's an object, fully present.
On a établi que tout est objet, sans exception. nil est le cas qui le prouve jusqu'au bout. Là où d'autres langages ont un null qui signifie « rien ici » — et qui plante quand on l'interroge — Ruby a nil : l'unique instance de NilClass, un objet qui a une classe et répond à des messages. Son fameux NoMethodError n'est pas un crash : c'est un objet qui décline poliment un message qu'il ne connaît pas.We established that everything is an object, no exceptions. nil is the case that proves it all the way down. Where other languages have a null meaning 'nothing here' — that crashes when queried — Ruby has nil: the sole instance of NilClass, an object that has a class and answers messages. Its infamous NoMethodError is no crash: it's an object politely declining a message it doesn't know.
nil.class # => NilClass nil.nil? # => true nil.to_s # => "" — nil répond, et utilement nil.to_a # => [] nil.inspect # => "nil" nil.upcase # NoMethodError: undefined method 'upcase' for nil # ↑ pas un crash mémoire : un objet qui dit « je n'ai pas ce message »
Le message d'erreur dit for nil — il y avait bien un destinataire, nil, un objet de classe NilClass. Il n'a juste pas la méthode upcase.The error says for nil — there was indeed a receiver, nil, an object of class NilClass. It simply lacks the upcase method.
« À quel objet est-ce que je parle ? » s'applique même à nil. Quand tu vois NoMethodError for nil, la question n'est pas « pourquoi ça a planté » mais « pourquoi ce receveur est-il nil au lieu de l'objet que j'attendais ? ». Le bug n'est jamais dans nil — il est en amont, là où nil s'est glissé."Which object am I talking to?" applies even to nil. When you see NoMethodError for nil, the question isn't "why did it crash" but "why is this receiver nil instead of the object I expected?". The bug is never in nil — it's upstream, where nil slipped in.
Le № 1 a posé l'envoi de message ; le № 2, que tout est objet. nil est le test ultime des deux : l'objet qu'on prend le plus souvent pour un « rien » est, lui aussi, un receveur. Comprendre nil, c'est cesser de craindre le NoMethodError et commencer à le lire comme une adresse : remonte à la source du nil.Issue № 1 set up the message send; № 2, that everything is an object. nil is the ultimate test of both: the object most often mistaken for 'nothing' is, too, a receiver. To understand nil is to stop fearing NoMethodError and start reading it as an address: trace back to the source of the nil.