Pergunta

No Ruby 1.8 e anteriores,

Foo

é uma constante (uma classe, um módulo ou outra constante).Enquanto

foo

é uma variável.A principal diferença é a seguinte:

module Foo
  bar = 7
  BAZ = 8
end

Foo::BAZ
# => 8

Foo::bar
# NoMethodError: undefined method 'bar' for Foo:Module

Está tudo muito bem, mas Ruby 1.9 permite código-fonte UTF-8.Assim é "maiúsculas" ou "minúsculas" no que diz respeito a isso?A respeito (subconjunto estrito) ou Ɖfoo?

Existe uma regra geral?

Mais tarde:

Ruby-core já está considerando alguns dos operadores matemáticos.Por exemplo

module Kernel
  def √(num)
    ...
  end
  def ∑(*args)
    ...
  end
end

permitiria

x = √2
y = ∑(1, 45, ...)

Eu adoraria ver

my_proc = λ { |...| ... }

x ∈ my_enumerable  # same as my_enumerable.include?(x)

my_infinite_range = (1..∞)

return 'foo' if x ≠ y

2.21 ≈ 2.2
Foi útil?

Solução 5

Não consigo fazer com que o IRB aceite caracteres UTF-8, então usei um script de teste (/tmp/utf_test.rb).

"λ" funciona bem como nome de variável:

# encoding: UTF-8
λ = 'foo'
puts λ

# from the command line:
> ruby -KU /tmp/utf_test.rb
foo

"λ" também funciona bem como nome de método:

# encoding: UTF-8
Kernel.class_eval do
  alias_method :λ, :lambda
end

(λ { puts 'hi' }).call

# from the command line:
> ruby -KU /tmp/utf_test.rb:
hi

Porém, não funciona como uma constante:

# encoding: UTF-8
Object.const_set :λ, 'bar'

# from the command line:
> ruby -KU /tmp/utf_test.rb:
utf_test.rb:2:in `const_set': wrong constant name λ (NameError)

Nem a versão em maiúscula:

# encoding: UTF-8
Object.const_set :Λ, 'bar'

# from the command line:
> ruby -KU /tmp/utf_test.rb:
utf_test.rb:2:in `const_set': wrong constant name Λ (NameError)

Minha suspeita é que os nomes das constantes devem começar com uma letra ASCII maiúscula (deve corresponder /^[A-Z]/).

Outras dicas

OK, minha resposta de brincadeira não caiu muito bem.

Esta pergunta da lista de discussão, com resposta de Matz indica que o Ruby 1.9 está integrado String#upcase e String#downcase métodos irão lidar apenas com caracteres ASCII.

Sem testar sozinho, eu veria isso como uma forte evidência de que todos os caracteres não-ascii no código-fonte provavelmente serão considerados minúsculos.

Alguém pode baixar e compilar o 1.9 mais recente e ver?

Eu não sei o que Ruby faria se você usasse caracteres UTF8 estendidos como identificadores em seu código-fonte, mas sei o que faria, que seria dar um tapa na sua nuca e dizer NÃO FAÇA ISSO

Eu adoraria ver

my_proc = λ { |...| ... }

x ∈ my_enumerable  # same as my_enumerable.include?(x)

my_infinite_range = (1..∞)

return 'foo' if x ≠ y

2.21 ≈ 2.2

Eu adoraria ver alguém tentando digitar esse programa em um teclado inglês :P

Em Ruby 1.9.2-p0 (YARV) o resultado é o mesmo da postagem original (ou seja, Foo::bar #=> # NoMethodError:método indefinido 'bar' para Foo:Module).Além disso, infelizmente, as letras com acento não são consideradas superiores nem inferiores e os métodos relacionados não produzem nenhum resultado.

Exemplos:

"á".upcase
=> "á"
"á" == "Á".downcase
=> false
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top