Como o Ruby 1.9 lida com casos de caracteres no código-fonte?
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
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