Qual è la differenza tra Class e Klass in rubino?


112

Qual è la differenza tra Class e Klass?


1
Dove hai visto quest'ultimo?
Darin Dimitrov

18
klassè comunemente usato per nominare una variabile che contiene un Classoggetto (ricorda che anche le classi sono oggetti), come in klass = String. Puoi fornire la fonte di dove l'hai visto per una spiegazione più profonda?
Chubas

5
No, non voglio fornire un'unica fonte perché non voglio che sia spiegata in questo modo. Voglio un quadro più ampio su questo
thenengah

5
A volte, le persone usano clazzinvece di klass(per esempio, nel libro "Metaprogramming Ruby").
Andrew Grimm

2
In TV Tropes, questo sarebbe chiamato "Xtreme Kool Letterz" (nessun collegamento - non è sicuro per la produttività).
Andrew Grimm

Risposte:


188

classè una parola chiave utilizzata per definire una nuova classe. Poiché è una parola chiave riservata, non puoi utilizzarla come nome di variabile. Non puoi usare nessuna delle parole chiave di Ruby come nomi di variabili, quindi non sarai in grado di avere variabili denominate defo moduleo ifo end, ecc - classnon è diverso.

Ad esempio, considera quanto segue:

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

Il tentativo di eseguire questo genera un errore, poiché non è possibile utilizzare classcome nome di variabile.

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

Per risolverlo, useremo klassinvece l'identificatore . Non è speciale, ma è convenzionalmente usato come nome di variabile quando hai a che fare con un nome di classe o classe. È foneticamente lo stesso, ma poiché non è una parola chiave riservata, Ruby non ha problemi con essa.

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

show_methods "Kernel"

L'output, come previsto, è

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

È possibile utilizzare qualsiasi nome di variabile (non riservato) lì, ma la comunità ha iniziato a utilizzarlo klass. Non ha alcuna magia speciale - significa semplicemente "Volevo usare il nome" classe "qui, ma non posso, poiché è una parola chiave riservata".

Una nota a margine, dal momento che l'hai digitato in modo sbagliato alcune volte, vale la pena notare che in Ruby, il caso è importante. I token che iniziano con una lettera maiuscola sono costanti. Tramite il piccone :

Un nome costante inizia con una lettera maiuscola seguita dai caratteri del nome. I nomi delle classi e dei moduli sono costanti e seguono le convenzioni di denominazione delle costanti. Per convenzione, le variabili costanti vengono normalmente scritte utilizzando lettere maiuscole e trattini bassi.

Pertanto, l'ortografia corretta è classand klass, anziché Classe Klass. Questi ultimi sarebbero costanti, ed entrambi Classe Klasssono nomi di costanti validi, ma sconsiglierei di usarli per scopi di chiarezza.


7
Ebbene, Classin particolare non solo è un nome costante valido, è anche esistente! (è la classe Class)
Asherah

1
Wow bellissimo. Capisci completamente adesso. Grazie Chris! :)
thenengah

1
Penso che l'uso di klasscome variabile locale derivi dal Piccone: hanno usato quel nome in un paio di esempi, esattamente per i motivi che hai descritto qui.
Ken Bloom

Questo deve applicare la vecchia versione di rubino. Con Ruby 1.9.3 utilizzoobject_instance.class.name == 'Object'
Augustin Riedinger

No, è ancora accurato. La classe di Object.new è Object, ma la classe di Object è Class.
Chris Heald

22

klassè anche un metodo Rails (o meglio ActiveRecord) . Viene utilizzato per ottenere la classe di un'associazione.

Come indicato nel contenuto collegato:

class Author < ActiveRecord::Base
  has_many :books
end

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

12

klasse clazze clasze simili sono errori di ortografia creativi usati per aggirare una parola riservata class.

Sarebbe molto meno stridente sugli occhi per utilizzare class1o clo classXo qualcosa piuttosto che un errore ortografico intenzionale.


5

Uno è il nome di una classe e l'altro è solo una costante non definita per impostazione predefinita. E per la coppia è più probabile che tu veda, classe klass, la prima è una parola chiave per definire le classi mentre la seconda è solo un identificatore (come qualsiasi altra stringa di caratteri). Viene utilizzato quando si desidera scrivere la parola "classe" ma non è possibile perché è una parola chiave riservata.


Qual è il punto, voglio dire perché / come usarlo, a cosa serve di solito?
thenengah

3
La classe @Sam è una parola chiave riservata per la definizione delle classi. Quindi, se vuoi trattare qualcosa con una classe generica (come la metaprogrammazione), non puoi scrivere class = Kernel.const_get(class_name). Ma puoi scrivere klass = Kernel.const_get(class_name), e questo è usato per rappresentare "classe".
Thiago Silveira

2
Il punto è che non puoi usare la parola chiave "classe" per significare "classe" ... perché è una parola riservata (logica circolare, lo so) quindi la parola "klass" viene sostituita. Questo è un linguaggio comune in molti altri linguaggi, ad esempio Java e C #.
Scott

così puoi assegnare dinamicamente la classe? Klass = object.class; Klass.new - qualcosa del genere
thenengah

3
@ Sam: Usarlo Klasssarebbe una scelta sbagliata, poiché gli identificatori che iniziano con lettere maiuscole sono costanti, quindi puoi impostarlo solo una volta. Ma sì, questa è l'idea generale.
Chuck
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.