¿Cuál es la diferencia entre Class y Klass en ruby?

112

¿Cuál es la diferencia entre Class y Klass?

thenengah
fuente
1
¿Dónde viste este último?
Darin Dimitrov
18
klassse usa comúnmente para nombrar una variable que contiene un Classobjeto (recuerde que las clases también son objetos), como en klass = String. ¿Puede proporcionar la fuente de dónde lo ha visto para una explicación más profunda?
Chubas
5
No, no quiero proporcionar una fuente única porque no quiero que se explique así. Quiero una imagen más amplia de esto
thenengah
5
A veces, la gente usa en clazzlugar de klass(por ejemplo, en el libro "Metaprogramación de Ruby").
Andrew Grimm
2
En TV Tropes, esto se llamaría "Xtreme Kool Letterz" (sin vínculo, no es seguro para la productividad).
Andrew Grimm

Respuestas:

188

classes una palabra clave utilizada para definir una nueva clase. Dado que es una palabra clave reservada, no puede usarla como nombre de variable. No puede usar ninguna de las palabras clave de Ruby como nombres de variable, por lo que no podrá tener variables nombradas defo moduleo ifo end, etc., classno es diferente.

Por ejemplo, considere lo siguiente:

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

Intentar ejecutar esto da como resultado un error, ya que no se puede usar classcomo nombre 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

Para solucionarlo, usaremos el identificador en su klasslugar. No es especial, pero se usa convencionalmente como nombre de variable cuando se trata de una clase o nombre de clase. Es fonéticamente lo mismo, pero como no es una palabra clave reservada, Ruby no tiene problemas con ella.

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

show_methods "Kernel"

La salida, como se esperaba, es

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

Puede usar cualquier nombre de variable (no reservado) allí, pero la comunidad ha comenzado a usar klass. No tiene ninguna magia especial, solo significa "Quería usar el nombre 'clase' aquí, pero no puedo, ya que es una palabra clave reservada".

En una nota al margen, dado que lo ha escrito mal varias veces, vale la pena señalar que en Ruby, el caso es importante. Las fichas que comienzan con una letra mayúscula son constantes. A través del pico :

Un nombre constante comienza con una letra mayúscula seguida de caracteres de nombre. Los nombres de las clases y los nombres de los módulos son constantes y siguen las convenciones de nombres constantes. Por convención, las variables constantes normalmente se escriben con letras mayúsculas y guiones bajos en todas partes.

Por lo tanto, la ortografía correcta es classy klass, en lugar de Classy Klass. Los últimos serían constantes, y ambos Classy Klassson nombres de constantes válidos, pero recomendaría no usarlos por motivos de claridad.

Chris Heald
fuente
7
Bueno, no solo es, Classen particular, un nombre de constante válido, ¡también existe! (es la clase Class)
Asherah
1
Wow hermoso. Entienda completamente ahora. Gracias Chris! :)
thenengah
1
Creo que el uso de klasscomo variable local proviene de Pickaxe; usaron ese nombre en un par de ejemplos, exactamente por las razones que describiste aquí.
Ken Bloom
Esto debe aplicar la versión antigua de rubí. Con Ruby 1.9.3 que usoobject_instance.class.name == 'Object'
Augustin Riedinger
No, sigue siendo exacto. La clase de Object.new es Object, pero la clase de Object es Class.
Chris Heald
22

klasstambién es un método Rails (o más bien ActiveRecord) . Se utiliza para obtener la clase de una asociación.

Como se indica en el contenido vinculado:

class Author < ActiveRecord::Base
  has_many :books
end

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

klassy clazzy otros claszsimilares son errores ortográficos creativos que se utilizan para sortear una palabra reservada class.

Sería mucho menos irritante para los ojos de usar class1o clo classXo algo más que una falta de ortografía intencional.

Jason S
fuente
5

Uno es el nombre de una clase y el otro es solo una constante indefinida por defecto. Y para el par es más probable que veas, classy klassel primero es una palabra clave para definir clases, mientras que el segundo es solo un identificador (como cualquier otra cadena de caracteres). Se utiliza cuando le gustaría escribir la palabra "clase" pero no puede porque es una palabra clave reservada.

Arrojar
fuente
¿Cuál es el punto, quiero decir por qué / cómo usarlo, para qué se usa generalmente?
thenengah
3
La clase @Sam es una palabra clave reservada para definir clases. Entonces, si quieres tratar algo con una clase genérica (como la metaprogramación), no puedes escribir class = Kernel.const_get(class_name). Pero puedes escribir klass = Kernel.const_get(class_name), y eso se usa para representar "clase".
Thiago Silveira
2
El punto es que no puede usar la palabra clave 'clase' para significar 'clase' ... porque es una palabra reservada (lógica circular, lo sé), por lo que la palabra 'klass' se sustituye en su lugar. Este es un modismo común en muchos otros lenguajes, por ejemplo, Java y C #.
Scott
para que pueda asignar clases dinámicamente? Klass = object.class; Klass.new - algo así
thenengah
3
@Sam: Usar Klasspara eso sería una mala elección, ya que los identificadores que comienzan con letras mayúsculas son constantes, por lo que solo puede configurarlo una vez. Pero sí, esa es la idea general.
Chuck