Как 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
22.08.2008 16:09:50
5 ОТВЕТОВ

Я не знаю, что сделал бы ruby, если бы вы использовали расширенные символы UTF8 в качестве идентификаторов в вашем исходном коде, но я знаю, что бы я сделал, то есть ударил бы вас по затылку и сказал, что НЕ ДЕЛАЙТЕ ЭТОГО

2
23.08.2008 03:56:32

ОК, мой шутливый ответ не удался так хорошо.

Этот список рассылки вопрос, с ответом из Мац показывает , что Ruby 1.9 построен в String#upcaseи String#downcaseметодов будет обрабатывать только ASCII - символы.

Без его тестирования я бы убедился в том, что все не-ascii символы в исходном коде, скорее всего, будут считаться строчными.

Может кто-нибудь скачать и скомпилировать последнюю 1.9 и посмотреть?

3
25.08.2008 02:47:49

Я бы хотел увидеть

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

1
25.08.2008 03:07:52
Ваше опасение определенно оправдано, но я бы с удовольствием собрал макросы Textmate, чтобы повернуть memberof + tab в ∈. Типизация не короче, чем include ?, но я думаю, что код говорит о том, что я имею в виду, более четко. Я уверен, что это проблема вкуса; Мне просто очень понравились мои дискретные уроки математики в колледже.
James A. Rosen 7.01.2009 22:11:47
РЕШЕНИЕ

Я не могу заставить 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]/).

0
16.09.2009 18:54:35

В Ruby 1.9.2-p0 (YARV) результат такой же, как и в оригинальном посте (т.е. Foo :: bar # => # NoMethodError: неопределенный метод 'bar' для Foo: Module). Кроме того, буквы с акцентом, к сожалению, не считаются ни верхними, ни нижними, и связанные методы не дают результата.

Примеры:

"á".upcase
=> "á"
"á" == "Á".downcase
=> false
1
15.12.2010 16:01:47