2008-08-22 17 views
5

en Ruby 1.8 y anteriores,¿Cómo maneja Ruby 1.9 casos de caracteres en el código fuente?

Foo 

es una constante (una clase, un módulo, o otra constante). Mientras que

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 es todo bien y bueno, pero Ruby 1.9 allows UTF-8 source code. Entonces, ¿es "mayúscula" o "lowecase" en lo que a esto se refiere? ¿Qué pasa con (subconjunto estricto) o Ɖfoo?

¿Existe una regla general?

después:

Rubí-núcleo 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 gustarí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 
+1

rubí convirtiendo en APL? –

Respuesta

0

no puedo conseguir IRB para aceptar caracteres UTF-8, por lo que se utiliza un script de prueba (/tmp/utf_test.rb).

"λ" funciona bien como un nombre de variable:

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

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

"λ" también funciona bien como un 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 

no funciona como una constante, sin embargo:

# 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úsculas:

# 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 mayúscula ASCII (debe coincidir con /^[A-Z]/).

2

No sé lo que haría si rubí Usted ha utilizado caracteres extendidos UTF8 como identificadores en su fuente código, pero sé lo que haría, lo que sería darle una bofetada en la parte posterior de la cabeza y decirle NO HAGA ESO

+1

Typo: tell => grito ;-) – webmat

3

OK, mi respuesta de broma no cayó tan bien.

This mailing list question, with answer from Matz indica que los métodos de Ruby 1.9 integrados en String#upcase y String#downcase solo manejarán caracteres ASCII.

Sin probarlo yo mismo, vería esto como una fuerte evidencia de que todos los caracteres no ascii en el código fuente probablemente se considerarán minúsculas.

¿Alguien puede descargar y compilar el último 1.9 y ver?

1

I would love to see

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 gustaría ver a alguien tratando de escribir ese programa en un teclado Inglés: P

+0

Su aprehensión está definitivamente justificada, pero gustosamente construiría macros de Textmate para convertir memberof + tab en ∈. La mecanografía no es más corta que include ?, pero creo que el código dice lo que quiero decir con más claridad. Estoy seguro de que es un problema de sabor; Realmente me gustaron mis clases discretas de matemáticas en la universidad. –

1

En de Ruby 1.9.2-p0 (YARV) el resultado es el mismo que en el post original (es decir, Foo :: bar # => # NoMethodError: método indefinido 'bar' para Foo: módulo). Además, las letras con acento desafortunadamente no se consideran superiores ni inferiores y los métodos relacionados no producen ningún resultado.

Ejemplos:

"á".upcase 
=> "á" 
"á" == "Á".downcase 
=> false 
Cuestiones relacionadas