¿Cómo maneja Ruby 1.9 los casos de caracteres en el código fuente?
Pregunta
En Ruby 1.8 y versiones anteriores,
Foo
es una constante (una clase, un módulo u otra constante).Mientras
foo
es una variable.La diferencia clave es la siguiente:
module Foo
bar = 7
BAZ = 8
end
Foo::BAZ
# => 8
Foo::bar
# NoMethodError: undefined method 'bar' for Foo:Module
Eso está muy bien, pero Ruby 1.9 permite código fuente UTF-8.Asi es ℃
¿"mayúsculas" o "minúsculas" en lo que a esto respecta?Qué pasa ⊂
(subconjunto estricto) o Ɖfoo
?
¿Existe una regla general?
Más tarde:
Ruby-core ya está considerando algunos de los operadores matemáticos.Por ejemplo
module Kernel
def √(num)
...
end
def ∑(*args)
...
end
end
permitiría
x = √2
y = ∑(1, 45, ...)
Me encantaría 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
Solución 5
No puedo hacer que IRB acepte caracteres UTF-8, así que utilicé un script de prueba (/tmp/utf_test.rb
).
"λ" funciona bien como nombre de variable:
# encoding: UTF-8
λ = 'foo'
puts λ
# from the command line:
> ruby -KU /tmp/utf_test.rb
foo
"λ" también funciona bien como nombre 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
Sin embargo, no funciona como una 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)
Tampoco la versión en mayú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)
Mi sospecha es que los nombres constantes deben comenzar con una letra ASCII mayúscula (debe coincidir /^[A-Z]/
).
Otros consejos
Vale, mi respuesta en broma no fue tan bien recibida.
Esta pregunta de la lista de correo, con respuesta de Matz indica que Ruby 1.9 está integrado String#upcase
y String#downcase
Los métodos solo manejarán caracteres ASCII.
Sin probarlo yo mismo, vería esto como una fuerte evidencia de que todos los caracteres que no sean ASCII en el código fuente probablemente se considerarán minúsculos.
¿Alguien puede descargar y compilar la última versión 1.9 y verlo?
No sé qué haría Ruby si usaras caracteres UTF8 extendidos como identificadores en tu código fuente, pero sé lo que yo haría, que sería darte una bofetada en la nuca y decirte NO HAGAS ESO.
Me encantaría 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
Me encantaría ver a alguien intentando escribir ese programa en un teclado en inglés :P
En Rubí 1.9.2-p0 (YARV) el resultado es el mismo que en la publicación original (es decir, Foo::bar #=> # NoMethodError:método indefinido 'barra' para Foo:Module).Además, lamentablemente las letras con tilde no se consideran superiores ni inferiores y los métodos relacionados no dan ningún resultado.
Ejemplos:
"á".upcase
=> "á"
"á" == "Á".downcase
=> false