klassest couramment utilisé pour nommer une variable contenant un Classobjet (rappelez-vous que les classes sont aussi des objets), comme dans klass = String. Pouvez-vous fournir la source d'où vous l'avez vu pour une explication plus approfondie?
Chubas
5
Non, je ne veux pas fournir une seule source parce que je ne veux pas qu'elle soit expliquée comme ça. Je veux une image plus grande à ce sujet
thenengah
5
Parfois, les gens utilisent clazzplutôt que klass(par exemple, dans le livre "Metaprogramming Ruby").
Andrew Grimm
2
Dans TV Tropes, cela s'appellerait "Xtreme Kool Letterz" (pas de lien - pas sûr pour la productivité).
Andrew Grimm
Réponses:
188
classest un mot-clé utilisé pour définir une nouvelle classe. Puisqu'il s'agit d'un mot clé réservé, vous ne pouvez pas l'utiliser comme nom de variable. Vous ne pouvez utiliser aucun des mots-clés de Ruby comme noms de variables, vous ne pourrez donc pas avoir de variables nommées defou moduleou ifou end, etc. - ce classn'est pas différent.
Par exemple, considérez ce qui suit:
def show_methods(class)
puts Object.const_get(class).methods.inspect
end
show_methods "Kernel"
Essayer d'exécuter ceci entraîne une erreur, car vous ne pouvez pas l'utiliser classcomme nom de variable.
Pour résoudre ce problème, nous utiliserons l'identifiant à la klassplace. Ce n'est pas spécial, mais il est traditionnellement utilisé comme nom de variable lorsque vous traitez avec un nom de classe ou de classe. C'est phonétiquement le même, mais comme ce n'est pas un mot-clé réservé, Ruby n'a aucun problème avec lui.
def show_methods(klass)
puts Object.const_get(klass).methods.inspect
end
show_methods "Kernel"
Vous pouvez y utiliser n'importe quel nom de variable (non réservé), mais la communauté a commencé à utiliser klass. Il n'a pas de magie particulière - cela signifie simplement "Je voulais utiliser le nom 'classe' ici, mais je ne peux pas, car c'est un mot-clé réservé".
En passant, puisque vous l'avez mal tapé à plusieurs reprises, il convient de noter que dans Ruby, le cas est important. Les jetons commençant par une majuscule sont des constantes. Via la pioche :
Un nom de constante commence par une lettre majuscule suivie de caractères de nom. Les noms de classe et les noms de module sont des constantes et suivent les conventions de dénomination des constantes. Par convention, les variables constantes sont normalement épelées en utilisant des lettres majuscules et des traits de soulignement partout.
Ainsi, l'orthographe correcte est classet klass, plutôt que Classet Klass. Ce dernier serait des constantes, et les deux Classet Klasssont des noms de constantes valides, mais je recommanderais de ne pas les utiliser à des fins de clarté.
Je pense que l'utilisation de klasscomme variable locale vient de la pioche - ils ont utilisé ce nom dans quelques exemples, pour exactement les raisons que vous avez décrites ici.
Ken Bloom du
Cela doit appliquer l'ancienne version ruby. Avec Ruby 1.9.3 j'utiliseobject_instance.class.name == 'Object'
Augustin Riedinger
Non, c'est toujours exact. La classe Object.new est Object, mais la classe Object est Class.
Chris Heald
22
klassest aussi une méthode Rails (ou plutôt ActiveRecord) . Il est utilisé pour obtenir la classe d'une association.
Comme indiqué dans le contenu lié:
classAuthor<ActiveRecord::Base
has_many :books
endAuthor.reflect_on_association(:books).klass
# => Book
L'un est le nom d'une classe et l'autre est simplement une constante non définie par défaut. Et pour la paire que vous êtes plus susceptible de voir, classet klassle premier est un mot-clé pour définir des classes tandis que le second n'est qu'un identifiant (comme toute autre chaîne de caractères). Il est utilisé lorsque vous souhaitez écrire le mot «classe», mais que vous ne pouvez pas parce que c'est un mot clé réservé.
À quoi ça sert, je veux dire pourquoi / comment l'utiliser, à quoi sert-il habituellement?
thenengah
3
@Sam class est un mot-clé réservé pour définir des classes. Donc, si vous voulez traiter quelque chose avec une classe générique (comme la métaprogrammation), vous ne pouvez pas écrire class = Kernel.const_get(class_name). Mais vous pouvez écrire klass = Kernel.const_get(class_name), et c'est utilisé pour représenter la "classe".
Thiago Silveira
2
Le fait est que vous ne pouvez pas utiliser le mot-clé «classe» pour signifier «classe» ... parce que c'est un mot réservé (logique circulaire, je sais) donc le mot «klass» est remplacé à la place. C'est un idiome courant dans de nombreux autres langages, par exemple Java et C #.
Scott
afin que vous puissiez attribuer dynamiquement la classe? Klass = object.class; Klass.new - quelque chose comme ça
thenengah
3
@Sam: Utiliser Klasspour cela serait un mauvais choix, car les identifiants commençant par des majuscules sont des constantes, vous ne pouvez donc le définir qu'une seule fois. Mais oui, c'est l'idée générale.
klass
est couramment utilisé pour nommer une variable contenant unClass
objet (rappelez-vous que les classes sont aussi des objets), comme dansklass = String
. Pouvez-vous fournir la source d'où vous l'avez vu pour une explication plus approfondie?clazz
plutôt queklass
(par exemple, dans le livre "Metaprogramming Ruby").Réponses:
class
est un mot-clé utilisé pour définir une nouvelle classe. Puisqu'il s'agit d'un mot clé réservé, vous ne pouvez pas l'utiliser comme nom de variable. Vous ne pouvez utiliser aucun des mots-clés de Ruby comme noms de variables, vous ne pourrez donc pas avoir de variables nomméesdef
oumodule
ouif
ouend
, etc. - ceclass
n'est pas différent.Par exemple, considérez ce qui suit:
Essayer d'exécuter ceci entraîne une erreur, car vous ne pouvez pas l'utiliser
class
comme nom de variable.Pour résoudre ce problème, nous utiliserons l'identifiant à la
klass
place. Ce n'est pas spécial, mais il est traditionnellement utilisé comme nom de variable lorsque vous traitez avec un nom de classe ou de classe. C'est phonétiquement le même, mais comme ce n'est pas un mot-clé réservé, Ruby n'a aucun problème avec lui.La sortie, comme prévu, est
Vous pouvez y utiliser n'importe quel nom de variable (non réservé), mais la communauté a commencé à utiliser
klass
. Il n'a pas de magie particulière - cela signifie simplement "Je voulais utiliser le nom 'classe' ici, mais je ne peux pas, car c'est un mot-clé réservé".En passant, puisque vous l'avez mal tapé à plusieurs reprises, il convient de noter que dans Ruby, le cas est important. Les jetons commençant par une majuscule sont des constantes. Via la pioche :
Ainsi, l'orthographe correcte est
class
etklass
, plutôt queClass
etKlass
. Ce dernier serait des constantes, et les deuxClass
etKlass
sont des noms de constantes valides, mais je recommanderais de ne pas les utiliser à des fins de clarté.la source
Class
en particulier un nom de constante valide, mais c'est aussi un nom existant! (c'est la classe classe)klass
comme variable locale vient de la pioche - ils ont utilisé ce nom dans quelques exemples, pour exactement les raisons que vous avez décrites ici.object_instance.class.name == 'Object'
klass
est aussi une méthode Rails (ou plutôt ActiveRecord) . Il est utilisé pour obtenir la classe d'une association.Comme indiqué dans le contenu lié:
la source
klass
etclazz
etclasz
ainsi de suite sont des fautes d'orthographe créatives utilisées pour contourner un mot réservéclass
.Il serait beaucoup moins choquant pour les yeux d'utiliser
class1
oucl
ouclassX
ou quelque chose plutôt qu'une faute d'orthographe intentionnelle.la source
L'un est le nom d'une classe et l'autre est simplement une constante non définie par défaut. Et pour la paire que vous êtes plus susceptible de voir,
class
etklass
le premier est un mot-clé pour définir des classes tandis que le second n'est qu'un identifiant (comme toute autre chaîne de caractères). Il est utilisé lorsque vous souhaitez écrire le mot «classe», mais que vous ne pouvez pas parce que c'est un mot clé réservé.la source
class = Kernel.const_get(class_name)
. Mais vous pouvez écrireklass = Kernel.const_get(class_name)
, et c'est utilisé pour représenter la "classe".Klass
pour cela serait un mauvais choix, car les identifiants commençant par des majuscules sont des constantes, vous ne pouvez donc le définir qu'une seule fois. Mais oui, c'est l'idée générale.