web-dev-qa-db-fra.com

Pourquoi __FILE__ est-il en majuscules et __dir__ en minuscules?

Dans Ruby 2.0.0-p0, le __dir__ La variable a été introduite pour un accès facile au répertoire du fichier en cours d'exécution.

Pourquoi est-ce __dir__ minuscule lorsque __FILE__ est en majuscule?

60
conradkleinespel

Je pense que c'est parce que __FILE__ Est une constante de temps d'analyse alors que __dir__ Est une fonction et renvoie File.dirname(File.realpath(__FILE__))

Pour plus de détails, voir Cette discussion

58
Intrepidd

TL; DR

Les mérites relatifs des choix d'implémentation du langage sont en dehors de la portée d'une question raisonnable de dépassement de pile. Cependant, c'est une bonne question car elle identifie un cas d'utilisation potentiellement déroutant dans la langue et cherche à clarifier la distinction entre les deux éléments linguistiques.

Mots clés, méthodes et mots clés qui ressemblent à des méthodes

__FILE__ est un mot clé

Dans Ruby 1.9, __FILE__ est un mot-clé. Même si cela ressemble à une méthode définie sur la classe Object, la source de Object #__ FILE __ dit:

# File keywords.rb, line 68
def __FILE__
end

Une analyse rapide de la source dans 2.0.0-p0 n'a pas révélé de fichier keywords.rb, mais on suppose que __FILE__ reste syntaxiquement un mot-clé. Peut-être que quelqu'un d'autre peut vous indiquer l'emplacement de la définition actuelle.

__dir__ est une méthode

Kernel #__ dir __ est en fait une méthode. Vous pouvez le constater par vous-même en appliquant les méthodes définies par le noyau:

Kernel.methods.grep /__dir__/
# => [:__dir__]

Bugs et discussions

Le fait que __FILE__ est à la fois un mot-clé et (en quelque sorte) une méthode est appelée dans un bug et un peu commentaire lié au bug . Il y a également eu une discussion sur les divers avantages et inconvénients de la convention de dénomination dans le Ruby-Core Forum .

Bien que la réponse puisse être un peu insatisfaisante, c'est la situation actuelle. S'il s'agit d'un problème de conception de langage qui vous tient à cœur, vous impliquer avec l'équipe principale de Ruby serait le bon moyen de le résoudre.

31
Todd A. Jacobs