Как Ruby 1.9 обрабатывает регистры символов в исходном коде? - PullRequest
5 голосов
/ 22 августа 2008

В 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 ]

3 голосов
/ 25 августа 2008

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

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

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

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

2 голосов
/ 23 августа 2008

Я не знаю, что бы сделал ruby, если бы вы использовали расширенные символы UTF8 в качестве идентификаторов в вашем исходном коде, но я знаю, что бы я сделал, то есть ударил бы вас по затылку и сказал: «НЕ» T DO THAT

1 голос
/ 15 декабря 2010

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

Примеры:

"á".upcase
=> "á"
"á" == "Á".downcase
=> false
1 голос
/ 25 августа 2008

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

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

0 голосов
/ 16 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...