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 をダウンロードしてコンパイルして確認できますか?

ソース コードで拡張 UTF8 文字を識別子として使用した場合、Ruby が何をするかはわかりませんが、私ならどうするかはわかります。それは、あなたの後頭部をひっくり返して、「そんなことはするな」と言うでしょう。

私が見てみたいです

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 (YARV) 結果は元の投稿と同じです (つまり、Foo::bar #=> # NoMethodError:Foo:Module の未定義メソッド 'bar')。また、アクセントのある文字は残念ながら上位または下位とは見なされず、関連するメソッドは結果を生成しません。

例:

"á".upcase
=> "á"
"á" == "Á".downcase
=> false
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top