2

さて、Rubyでは大文字の識別子が「一定」であるように見えることは誰もが知っています。

ただし、定数に新しい値を割り当てることは可能であるため、次のように機能します

class A
  def self.hi; "hi"; end
end
class B
  def self.hi; "ho"; end
end
A.hi # => "hi"
B.hi # => "ho"
A = B
#  warning: already initialized constant A
# => B
A.hi # => "ho"

また、小文字の識別子への割り当ても機能します。

a = B
a.hi # => "ho"

ただし、内部名はすべての場合で「B」に設定され、新しい識別子名も「B」のみを参照しています。

しかし、識別子に小文字の名前を付けても技術的に問題がない場合、クラスの内部名にこの制限があるのはなぜですか?一定ではないので、一定である必要があるということはあり得ません。したがって、他の理由は、小文字の識別子のスコープが異なることである可能性があります。しかし、それでは、なぜ小文字のスコープを持つクラスを持たないのでしょうか。

パーサーはUnicodeなどのメソッド名も許可しているので、不思議に思っています。そのため、クラスの場合、それがはるかに制限されているのは奇妙に思えます。

4

2 に答える 2

1

あなたが言ったように、クラスの名前はそれが割り当てられた最初の定数の名前です。キーワードは名前付きクラスの作成にのみ使用するclassことが決定されているため、定数はキーワードでのみ使用できます。class

おそらく、ローカル変数を許可するとclass lowercase_class_name、小文字と大文字の識別子の違いがわからず、使用者が使用を混乱させ、クラス名がどこにも表示されないのはなぜか(つまり、なぜdef foo() lowercase_class_name.new end機能しなかったのか)疑問に思うからです。

定数に固有のクラスを作成するデフォルトの方法を作成することにより、この方法で定義されたクラスはどこにでも表示され、少なくともその名前に関連付けられた値を変更しないように提案されます(つまり、警告が表示されます)。

自分が何をしているのかを知っている人はlocal_variable = Class.new { ... }、必要に応じてそれでもできます。

于 2010-01-03T15:02:55.560 に答える
-1

インタプリタは、それがクラス名であるか、現在のクラス/モジュールのメンバー変数であるかを確認する1つの方法を必要とします。

インタープリターは、メンバー変数がクラスハッシュテーブルにある間、グローバルハッシュテーブルでクラス名を検索する必要があります。ローカル変数は、ハッシュテーブルをまったく検索せずにインタープリターによって解決できるため、異なります(メンバー変数よりも優先されます)。

そして、通訳者が識別子について知っているのは文字だけです。したがって、表記上の違いがあります。これは、グローバル変数の前に$があり、クラス変数に@文字がある理由でもあります。このため、インタプリタには検索する必要のある他のハッシュテーブルがあります。

他のスクリプト言語にも同様の制限があります。たとえば、PHPでは各変数の前に1ドルが必要です。

于 2010-01-03T05:39:36.067 に答える