Ruby 1.9如何处理源代码中的字符大小写?

时间:2008-08-22 16:09:50

标签: ruby encoding utf-8

在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 allows UTF-8 source code。那么“大写”还是“低级”呢?那么(严格子集)还是Ɖ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 个答案:

答案 0 :(得分:3)

好吧,我开玩笑的答案并没有那么顺利。

This mailing list question, with answer from Matz表示Ruby 1.9内置的String#upcaseString#downcase方法只能处理ASCII字符。

如果不自行测试,我会将此视为源代码中所有非ascii字符可能被视为小写的强有力证据。

有人可以下载并编译最新的1.9并看到吗?

答案 1 :(得分:2)

如果您在源代码中使用扩展的UTF8字符作为标识符,我不知道ruby会做什么,但是我知道我会做什么,这会让你狠狠地抬起头来告诉你DON' T DO THAT

答案 2 :(得分:1)

  

我很想看到

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

答案 3 :(得分:1)

Ruby 1.9.2-p0(YARV)中,结果与原始帖子相同(即,Foo :: bar#=>#NoMethodError:undefined method'bar'for FOO:模块)。此外,遗憾的是,带有重音的字母不被视为上限或下限,相关方法不会产生任何结果。

示例:

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

答案 4 :(得分:0)

我无法让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]/匹配)。