Quelle est la différence entre Class et Klass en rubis?

112

Quelle est la différence entre Class et Klass?

alorsengah
la source
1
Où avez-vous vu ce dernier?
Darin Dimitrov
18
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.

test.rb:1: syntax error, unexpected kCLASS, expecting ')'
    def show_methods(class)
                          ^
test.rb:2: syntax error, unexpected ')'
      puts Object.const_get(class).methods.inspect

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"

La sortie, comme prévu, est

["method", "inspect", "name", "public_class_method", "chop!"...

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é.

Chris Heald
la source
7
Eh bien, non seulement est Classen particulier un nom de constante valide, mais c'est aussi un nom existant! (c'est la classe classe)
Asherah
1
Wow belle. Comprenez complètement maintenant. Merci Chris! :)
thenengah
1
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é:

class Author < ActiveRecord::Base
  has_many :books
end

Author.reflect_on_association(:books).klass
# => Book
DazBaldwin
la source
12

klasset clazzet claszainsi 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 class1ou clou classXou quelque chose plutôt qu'une faute d'orthographe intentionnelle.

Jason S
la source
5

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é.

Mandrin
la source
À 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.
Chuck