Как Ruby 1.9 обрабатывает регистры символов в исходном коде?

StackOverflow https://stackoverflow.com/questions/22764

  •  09-06-2019
  •  | 
  •  

Вопрос

В 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top