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

时间:2020-03-05 18:42:06  来源:igfitidea点击:

在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

解决方案

回答

我不知道如果我们在源代码中使用扩展的UTF8字符作为标识符,ruby会怎么做,但是我知道我会怎么做,那就是将我们打倒在脑后,告诉我们不要这样做

回答

好吧,我的笑话回答得不太好。

这个邮件清单问题,加上Matz的回答,表明Ruby 1.9的内建在String#upcaseString#downcase方法中只能处理ASCII字符。

如果不自己进行测试,我会认为这是有力的证据,证明源代码中的所有非ASCII字符都可能被认为是小写字母。

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

回答

I would love to see
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

回答

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

回答

在Ruby 1.9.2-p0(YARV)中,结果与原始帖子相同(即Foo :: bar#=> NoMethodError:Foo:Module的未定义方法'bar')。而且,不幸的是,带有重音符号的字母不会被视为上下字母,并且相关方法也不会产生任何结果。

例子:

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