Как Ruby 1.9 обрабатывает регистры символов в исходном коде?
Вопрос
В Ruby 1.8 и более ранних версиях,
Foo
является константой (классом, Модулем или другой константой).Принимая во внимание , что
foo
является переменной величиной.Ключевое отличие заключается в следующем:
module Foo
bar = 7
BAZ = 8
end
Foo::BAZ
# => 8
Foo::bar
# NoMethodError: undefined method 'bar' for Foo:Module
Это все хорошо, но Ruby 1.9 допускает исходный код в формате UTF-8.Так и есть ℃
"верхний регистр" или "нижний регистр", насколько это возможно?О чем ⊂
(строгое подмножество) или Ɖfoo
?
Существует ли какое-то общее правило?
Позже:
Ruby-core уже рассматривает некоторые математические операторы.Например
module Kernel
def √(num)
...
end
def ∑(*args)
...
end
end
позволило бы
x = √2
y = ∑(1, 45, ...)
Я бы с удовольствием посмотрел
my_proc = λ { |...| ... }
x ∈ my_enumerable # same as my_enumerable.include?(x)
my_infinite_range = (1..∞)
return 'foo' if x ≠ y
2.21 ≈ 2.2
Решение 5
Я не могу заставить IRB принимать символы UTF-8, поэтому я использовал тестовый скрипт (/tmp/utf_test.rb
).
"λ" отлично работает в качестве имени переменной:
# encoding: UTF-8
λ = 'foo'
puts λ
# from the command line:
> ruby -KU /tmp/utf_test.rb
foo
"λ" также отлично работает в качестве имени метода:
# 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
Однако это не работает как константа:
# 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)
Как и версия с заглавной буквы:
# 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)
Я подозреваю, что имена констант должны начинаться с заглавной буквы ASCII (должны совпадать /^[A-Z]/
).
Другие советы
Ладно, мой шутливый ответ прозвучал не очень хорошо.
Этот вопрос из списка рассылки с ответом от Matz указывает, что Ruby 1.9 встроен String#upcase
и String#downcase
методы будут обрабатывать только символы ASCII.
Не тестируя это самостоятельно, я бы счел это убедительным доказательством того, что все символы, отличные от ascii, в исходном коде, скорее всего, будут считаться строчными.
Может кто-нибудь скачать и скомпилировать последнюю версию 1.9 и посмотреть?
Я не знаю, что бы сделал ruby, если бы вы использовали расширенные символы UTF8 в качестве идентификаторов в своем исходном коде, но я знаю, что бы я сделал, а именно хлопнул вас по затылку и сказал, ЧТОБЫ вы ЭТОГО НЕ ДЕЛАЛИ
Я бы с удовольствием посмотрел
my_proc = λ { |...| ... }
x ∈ my_enumerable # same as my_enumerable.include?(x)
my_infinite_range = (1..∞)
return 'foo' if x ≠ y
2.21 ≈ 2.2
Я бы с удовольствием посмотрел, как кто-нибудь пытается набрать эту программу на английской клавиатуре: P
В Ruby 1.9.2-p0 (ЯРВ) результат тот же, что и в исходном сообщении (т.е. Foo::bar #=> # NoMethodError:неопределенный метод 'bar' для Foo:Module).Кроме того, буквы с ударением, к сожалению, не считаются ни заглавными, ни строчными, и связанные с ними методы не дают результата.
Примеры:
"á".upcase
=> "á"
"á" == "Á".downcase
=> false