Was ist der Unterschied zwischen Class und Klass in Ruby?

112

Was ist der Unterschied zwischen Class und Klass?

thenengah
quelle
1
Wo hast du letzteres gesehen?
Darin Dimitrov
18
klasswird häufig verwendet, um eine Variable zu benennen, die ein ClassObjekt enthält (denken Sie daran, dass Klassen auch Objekte sind), wie in klass = String. Können Sie die Quelle, an der Sie sie gesehen haben, für eine tiefere Erklärung angeben?
Chubas
5
Nein, ich möchte keine einzige Quelle bereitstellen, weil ich nicht möchte, dass dies so erklärt wird. Ich möchte ein größeres Bild davon
thenengah
5
Manchmal verwenden die Leute clazzeher als klass(zum Beispiel im Buch "Metaprogramming Ruby").
Andrew Grimm
2
In TV Tropes würde dies als "Xtreme Kool Letterz" bezeichnet (kein Link - nicht produktivitätssicher).
Andrew Grimm

Antworten:

188

classist ein Schlüsselwort zum Definieren einer neuen Klasse. Da es sich um ein reserviertes Schlüsselwort handelt, können Sie es nicht als Variablennamen verwenden. Sie können keines von Rubys Schlüsselwörtern als Variablennamen verwenden, daher können Sie keine Variablen mit dem Namen defoder moduleoder ifoder endusw. verwenden - das classist nicht anders.

Betrachten Sie beispielsweise Folgendes:

def show_methods(class)
  puts Object.const_get(class).methods.inspect
end
show_methods "Kernel"

Der Versuch, dies auszuführen, führt zu einem Fehler, da Sie ihn nicht classals Variablennamen verwenden können.

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

Um dies zu beheben, verwenden wir klassstattdessen den Bezeichner . Es ist nichts Besonderes, wird aber üblicherweise als Variablenname verwendet, wenn Sie mit einer Klasse oder einem Klassennamen arbeiten. Es ist phonetisch dasselbe, aber da es kein reserviertes Schlüsselwort ist, hat Ruby keine Probleme damit.

def show_methods(klass)
  puts Object.const_get(klass).methods.inspect
end

show_methods "Kernel"

Die Ausgabe ist wie erwartet

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

Sie können dort einen beliebigen (nicht reservierten) Variablennamen verwenden, der jedoch von der Community verwendet wurde klass. Es hat keine besondere Magie - es bedeutet nur "Ich wollte hier den Namen 'Klasse' verwenden, aber ich kann nicht, da es ein reserviertes Schlüsselwort ist".

Nebenbei bemerkt, da Sie es einige Male falsch geschrieben haben, ist es erwähnenswert, dass in Ruby der Fall wichtig ist. Token, die mit einem Großbuchstaben beginnen, sind Konstanten. Über die Spitzhacke :

Ein konstanter Name beginnt mit einem Großbuchstaben, gefolgt von Namenszeichen. Klassennamen und Modulnamen sind Konstanten und folgen den Konstanten-Namenskonventionen. Konventionelle Variablen werden normalerweise durchgehend mit Großbuchstaben und Unterstrichen geschrieben.

Somit ist die korrekte Schreibweise classund klassstatt Classund Klass. Letztere wären Konstanten und beide Classund Klasssind gültige Konstantennamen, aber ich würde aus Gründen der Klarheit empfehlen, sie nicht zu verwenden.

Chris Heald
quelle
7
Nun, es ist nicht nur Classein gültiger konstanter Name, sondern auch ein noch vorhandener! (Es ist die Klassenklasse)
Asherah
1
Wow, wunderschön. Verstehe jetzt ganz. Danke Chris! :)
thenengah
1
Ich denke, dass die Verwendung klassals lokale Variable von der Spitzhacke stammt - sie haben diesen Namen in einigen Beispielen verwendet, genau aus den Gründen, die Sie hier beschrieben haben.
Ken Bloom
Dies muss alte Ruby-Version anwenden. Mit Ruby 1.9.3 benutze ichobject_instance.class.name == 'Object'
Augustin Riedinger
Nein, es ist immer noch genau. Die Klasse von Object.new ist Object, aber die Klasse von Object ist Class.
Chris Heald
22

klassist auch eine Rails- Methode (oder besser ActiveRecord- Methode) . Es wird verwendet, um die Klasse eines Vereins zu erhalten.

Wie im verlinkten Inhalt angegeben:

class Author < ActiveRecord::Base
  has_many :books
end

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

klassund clazzund claszund dergleichen sind kreative Rechtschreibfehler, die verwendet werden, um ein reserviertes Wort zu umgehenclass .

Es wäre weit weniger auf den Augen Erschütterungen zu verwenden class1oder cloder classXoder etwas eher als eine vorsätzliche falsche Schreibweise.

Jason S.
quelle
5

Einer ist der Name einer Klasse und der andere ist standardmäßig nur eine undefinierte Konstante. Und für das Paar, das Sie eher sehen, classund klassdas erstere ist ein Schlüsselwort zum Definieren von Klassen, während das letztere nur ein Bezeichner ist (wie jede andere Zeichenfolge). Es wird verwendet, wenn Sie das Wort "Klasse" schreiben möchten, dies jedoch nicht können, da es sich um ein reserviertes Schlüsselwort handelt.

Futter
quelle
Was ist der Punkt, ich meine, warum / wie es verwendet wird, wofür wird es normalerweise verwendet?
Thenengah
3
Die @ Sam-Klasse ist ein reserviertes Schlüsselwort zum Definieren von Klassen. Wenn Sie sich also mit einer generischen Klasse befassen möchten (z. B. Metaprogrammierung), können Sie nicht schreiben class = Kernel.const_get(class_name). Aber Sie können schreiben klass = Kernel.const_get(class_name), und das wird verwendet, um "Klasse" darzustellen.
Thiago Silveira
2
Der Punkt ist, dass Sie das Schlüsselwort "Klasse" nicht für "Klasse" verwenden können ... da es sich um ein reserviertes Wort handelt (zirkuläre Logik, ich weiß), wird stattdessen das Wort "klass" ersetzt. Dies ist eine gängige Redewendung in vielen anderen Sprachen, z. B. Java und C #.
Scott
Sie können also dynamisch Klassen zuweisen? Klass = object.class; Klass.new - so etwas
thenengah
3
@Sam: Dies Klasszu verwenden wäre eine schlechte Wahl, da Bezeichner, die mit Großbuchstaben beginnen, Konstanten sind, sodass Sie sie nur einmal festlegen können. Aber ja, das ist die allgemeine Idee.
Chuck