Qual é a diferença entre Class e Klass em ruby?

112

Qual é a diferença entre Class e Klass?

Thenengah
fonte
1
Onde você viu este último?
Darin Dimitrov
18
klassé comumente usado para nomear uma variável que contém um Classobjeto (lembre-se de que as classes também são objetos), como em klass = String. Você pode fornecer a fonte de onde você viu isso para uma explicação mais profunda?
Chubas
5
Não, não quero fornecer uma única fonte porque não quero que seja explicado assim. Eu quero uma imagem maior sobre isso
thenengah
5
Às vezes, as pessoas usam em clazzvez de klass(por exemplo, no livro "Metaprogramming Ruby").
Andrew Grimm
2
Na TV Tropes, isso seria chamado de "Xtreme Kool Letterz" (sem link - não é seguro para a produtividade).
Andrew Grimm

Respostas:

188

classé uma palavra-chave usada para definir uma nova classe. Por ser uma palavra-chave reservada, você não pode usá-la como nome de variável. Você não pode usar nenhuma das palavras-chave do Ruby como nomes de variáveis, então você não será capaz de ter variáveis ​​nomeadas defou moduleou ifou end, etc - classnão é diferente.

Por exemplo, considere o seguinte:

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

Tentar executar isso resulta em um erro, pois você não pode usar classcomo um nome de variável.

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 consertar, usaremos o identificador klass. Não é especial, mas é convencionalmente usado como um nome de variável quando você está lidando com uma classe ou nome de classe. É foneticamente o mesmo, mas como não é uma palavra-chave reservada, Ruby não tem problemas com ela.

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

show_methods "Kernel"

A saída, como esperado, é

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

Você poderia usar qualquer nome de variável (não reservado) lá, mas a comunidade começou a usar klass. Não tem nenhuma mágica especial - significa apenas "Eu queria usar o nome 'classe' aqui, mas não posso, pois é uma palavra-chave reservada".

Em uma nota lateral, já que você digitou errado algumas vezes, é importante notar que em Ruby, o caso importa. Os tokens que começam com uma letra maiúscula são constantes. Via o Picareta :

Um nome constante começa com uma letra maiúscula seguida por caracteres de nome. Os nomes das classes e dos módulos são constantes e seguem as convenções de nomenclatura de constantes. Por convenção, as variáveis ​​constantes são normalmente escritas com letras maiúsculas e sublinhados.

Assim, a grafia correta é classe klass, em vez de Classe Klass. Os últimos seriam constantes, e ambos Classe Klasssão nomes de constantes válidos, mas eu não recomendaria usá-los para fins de clareza.

Chris Heald
fonte
7
Bem, não é apenas Classum nome constante válido, mas também existente! (é a aula)
Asherah
1
Uau lindo. Compreenda completamente agora. Obrigado Chris! :)
thenengah
1
Acho que o uso de klasscomo uma variável local vem da Picareta - eles usaram esse nome em alguns exemplos, exatamente pelas razões que você descreveu aqui.
Ken Bloom
Isso deve ser aplicado à versão antiga do ruby. Com Ruby 1.9.3 eu usoobject_instance.class.name == 'Object'
Augustin Riedinger
Não, ainda está correto. A classe de Object.new é Object, mas a classe de Object é Class.
Chris Heald
22

klasstambém é um método Rails (ou melhor, ActiveRecord) . É usado para obter a classe de uma associação.

Conforme declarado no conteúdo do link:

class Author < ActiveRecord::Base
  has_many :books
end

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

klassand clazzand claszand like são erros de ortografia criativos usados ​​para contornar uma palavra reservada class.

Seria muito menos chocante para os olhos usar class1ou clou classXou algo do que um erro de ortografia intencional.

Jason S
fonte
5

Um é o nome de uma classe e o outro é apenas uma constante indefinida por padrão. E para o par, você provavelmente verá, classe klass, a primeira é uma palavra-chave para definir classes, enquanto a última é apenas um identificador (como qualquer outra sequência de caracteres). É usado quando você gostaria de escrever a palavra "classe", mas não pode porque é uma palavra-chave reservada.

Mandril
fonte
Qual é o ponto, quero dizer, por que / como usá-lo, para que geralmente é usado?
thenengah
3
@Sam class é uma palavra-chave reservada para definir classes. Portanto, se você quiser lidar com uma classe genérica (como metaprogramação), não poderá escrever class = Kernel.const_get(class_name). Mas você pode escrever klass = Kernel.const_get(class_name), e isso é usado para representar "classe".
Thiago Silveira
2
A questão é que você não pode usar a palavra-chave 'classe' para significar 'classe' ... porque é uma palavra reservada (lógica circular, eu sei), então a palavra 'klass' é substituída. Este é um idioma comum em muitas outras linguagens, por exemplo, Java e C #.
Scott
para que você possa atribuir turmas dinamicamente? Klass = object.class; Klass.new - algo assim
thenengah
3
@ Sam: Usar Klasspara isso seria uma escolha ruim, já que identificadores que começam com letras maiúsculas são constantes, então você só poderia defini-los uma vez. Mas sim, essa é a ideia geral.
Chuck