Pergunta

Ok, todo mundo sabe que capitalizados identificadores são vistos como 'constante' em Ruby.

No entanto, é possível atribuir um novo valor para constantes, portanto, as seguintes obras

class A
  def self.hi; "hi"; end
end
class B
  def self.hi; "ho"; end
end
A.hi # => "hi"
B.hi # => "ho"
A = B
#  warning: already initialized constant A
# => B
A.hi # => "ho"

e também não atribuir uma letra minúscula identificador de trabalho:

a = B
a.hi # => "ho"

No entanto, o nome interno é definido como 'B' em todos os casos e o novo identificador de nomes também estão apenas a referência 'B'.

Mas se é tecnicamente bem para o identificador de ter um nome em minúsculas, porque é que esta restrição no nome interno para a turma?Não pode ser que ele precisa ser constante, porque ele não é constante;outra razão pela qual poderia ser em minúsculas identificadores têm um escopo diferente.Mas então:por que não ter uma classe com minúsculas escopo?

Eu estou querendo saber porque o analisador permite nomes de método em unicode e tal, por isso, parece estranho que para classes é muito mais restrito.

Foi útil?

Solução

Como você disse, o nome de uma classe é o da primeira constante tem sido atribuída.Você só pode usar constantes com o class palavra-chave, pois foi decidido que o class palavra-chave deve ser usada apenas para criar denominados classes.

O racional sendo, provavelmente, permitindo que as variáveis locais iria confundir usa, que iria usar class lowercase_class_name, não sabendo a diferença entre minúsculas e maiúsculas identificadores e depois perguntam por que o nome da classe não estava visível em todos os lugares (por exemplo,por def foo() lowercase_class_name.new end não trabalho).

Fazendo a forma padrão para criar classes específicas constantes, classes definidas, desta forma será visível em todos os lugares, e há pelo menos uma sugestão de que o valor associado a esse nome não deve alterar (por exemplo,você receber um aviso em contrário).

As pessoas que sabem o que estão fazendo ainda pode fazer local_variable = Class.new { ... } em caso de necessidade.

Outras dicas

O intérprete precisa de uma maneira de descobrir se ele é um nome de Classe ou uma variável de membro de classe/módulo.

O intérprete tem a pesquisa de nomes de classe global, tabela de hash, enquanto as variáveis de membro da classe de tabela de hash.Variáveis locais são diferentes, como eles podem ser resolvidos por intérprete sem olhar tabelas de hash em todos (eles têm precedência sobre variáveis de membro).

E a única coisa que o intérprete sabe sobre um identificador são os personagens.Portanto, não há o notational diferença.É também a razão pela qual as variáveis globais tem um precedente $ e variáveis de classe um caractere@.Para isso, o intérprete tem outras tabelas de hash tem que pesquisar.

Outras linguagens de script têm restrições semelhantes, por exemplo, o PHP necessita de um dólar na frente de cada variável.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top