2010-11-28 19 views
86

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

+1

¿Dónde viste esto último? –

+0

He visto Klass en más de un lugar. Recientemente cuando se investiga singletons – s84

+14

'klass' se usa comúnmente para nombrar una variable que contiene un objeto' Class' (recuerde que las clases también son objetos), como en 'klass = String'. ¿Puedes proporcionar la fuente de dónde lo has visto para obtener una explicación más profunda? – Chubas

Respuesta

150

class es una palabra clave utilizada para definir una nueva clase. Como 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 llamadas def o module o if o end, etc. - class no 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 resulta en un error, ya que no puede utilizar class como 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 

solucionarlo, vamos a utilizar el identificador klass lugar. No es especial, pero se usa convencionalmente como nombre de variable cuando se trata de un nombre de clase o clase. Es fonéticamente lo mismo, pero como no es una palabra reservada, Ruby no tiene problemas.

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

show_methods "Kernel" 

de salida, como se esperaba, es

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

usted podría utilizar cualquier nombre (no reservado) variable de allí, pero la comunidad ha llevado 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 lateral, ya que lo ha escrito incorrectamente un par de veces, vale la pena señalar que en Ruby, el caso es importante. Los tokens que comienzan con una letra mayúscula son constantes. A través de Pickaxe:

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

Por lo tanto, la escritura correcta es class y klass, en lugar de Class y Klass. Las últimas serían constantes, y tanto Class como Klass son nombres constantes válidos, pero recomendaría no usarlos para mayor claridad.

+7

¡Bien, no solo 'Clase 'en particular es un nombre constante válido, también es uno existente! (es la clase Class) – Ashe

+1

Guau, hermosa. Comprende completamente ahora. Gracias Chris! :) – s84

+1

Creo que el uso de 'klass' como una variable local proviene del Pico - usaron ese nombre en un par de ejemplos, exactamente por las razones que describiste aquí. –

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 vea, class y klass, el primero es una palabra clave para definir clases mientras que el último es solo un identificador (como cualquier otra cadena de caracteres). Se usa cuando le gustaría escribir la palabra "clase" pero no porque es una palabra clave reservada.

+0

¿Cuál es el punto, me refiero a por qué/cómo lo uso, para qué se usa habitualmente? – s84

+3

@Sam class es una palabra clave reservada para definir clases. Entonces, si quiere tratar algo con una clase genérica (como metaprogramación), no puede escribir 'class = Kernel.const_get (class_name)'. Pero puede escribir 'klass = Kernel.const_get (class_name)', y eso se usa para representar "clase". –

+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. Esta es una expresión común en muchos otros idiomas, p. Java y C#. – Scott

9

klass y clazz y clasz y similares son faltas de ortografía creativas utilizadas para evitar una palabra reservada class.

Sería mucho menos desagradable para los ojos utilizar class1 o cl o classX o algo así como una falta de ortografía intencional.

9

Creo que klass es también un Rails (o más bien ActiveRecord) method. Se usa para obtener la clase de una asociación.

Cuestiones relacionadas