5

Rubyのすべてがオブジェクトであり、irbを開いて次のよう4.classに入力"Text".classし、オブジェクトがどのクラスからのものであるかを確認できることを考えると、なぜ戻り値if.classを与えないのでしょうか。unless.class

4

3 に答える 3

10

Rubyのすべてがオブジェクトであることを考えると

それはあなたの「オブジェクト」とすべての「もの」の定義に依存します。「オブジェクト」とは、「プログラムで操作できるエンティティ」(これからオブジェクトと呼びます)、または「オブジェクトシステムのメンバーである値」 (これから呼びます)を意味Objectします。

Rubyでは、プログラム(つまり、すべてのオブジェクト)で操作できるものはすべてObject、つまりクラスのインスタンスでもあります。これは、たとえば、プリミティブをプログラムで操作できる(つまり、その意味でのオブジェクトObjectsである)Javaとは異なりますが、そうではありません。Rubyでは、この区別は存在しません。すべてのオブジェクトはでありObject、すべてはオブジェクトObjectでもあります。

ただし、言語には、プログラムで操作できず、クラスのインスタンスではないものがあります。つまり、オブジェクトでもオブジェクトでもありません。これらは、たとえば、メソッド、変数、構文、パラメーターリスト、引数リスト、キーワードです。Object

注:RubyのリフレクションAPIを使用して、メソッドまたはパラメーターリストを表すオブジェクトを提供できますが、そのオブジェクトは単なるプロキシであり、本物ではありません。

つまり、「すべてがオブジェクトである」と言うとき、私たちが実際に意味するのは、「すべてのオブジェクトObject」であるということです。つまり、プログラムによって操作できるすべてのものがオブジェクトシステムのメンバーでもある、つまり、オブジェクトシステムの外部の値はありません(Javaのプリミティブとは異なります)。言語に存在するすべてのものが実行時にプログラムによって操作できることを意味するものではありません。

なぜそうし、戻り値if.classを与えないのかunless.class

まず最初に、オブジェクトであったとして 、それらはあなたが思っていることをしません。Rubyのように言うとき、それは「ローカル変数を逆参照する」または「暗黙のレシーバーとしてメソッドを呼び出す」ことを意味します。引数リストなし」。それで、if foofoofooself

if.class

ローカル変数によって参照ifされるオブジェクトのクラスまたはメソッドによって返されるオブジェクトのクラスのいずれかを提供しますがif、それ自体のクラスは提供しませんif

ただし、Rubyではキーワードと制御フローはオブジェクトではないため、if制御フローのキーワードはオブジェクトではありません(オブジェクトでも)でもありません。Object

MatzとDavidFlanaganによる本TheRubyProgramming Languageの中で、 2ページに書かれています。

すべての値はオブジェクトです

すべてを言っているのではなく、すべてのだけを言っていることに注意してください

質問「変数はルビーのオブジェクトですか? 」も参照してください。

于 2012-12-12T11:39:59.823 に答える
4

それらは言語のキーワードであり、オブジェクトではないからです。一般に、変数に割り当てることができるものはすべてオブジェクトです。

技術的に正確に言うと、などのキーワードには、コンパイラ/インタプリタによって使用されるクラスが含まれているunless 可能性がありますが(実際の実装によって異なります)、言語ユーザーとしては、リモートで実際に使用することすらできないため、そうではありません。あなたにさらされた。

于 2012-12-12T10:36:08.583 に答える
1
1.9.2-p320 :019 > def meth
1.9.2-p320 :020?>   'meth'
1.9.2-p320 :021?>   end
 => nil 
1.9.2-p320 :022 >  

疑問符とインデントを観察すると、IRBが継続が必要なものを検出すると、インデントされます。

1.9.2-p320 :022 > if.class
1.9.2-p320 :023?>   ...
1.9.2-p320 :028?>   end
SyntaxError: (irb):22: syntax error, unexpected '.'
if.class
   ^
(irb):28: syntax error, unexpected keyword_end, expecting $end

1.9.2-p320 :045 > if.if
1.9.2-p320 :046?>   end
SyntaxError: (irb):45: syntax error, unexpected '.'
if.if
   ^

1.9.2-p320 :060 > str = 'abc'
 => "abc" 
1.9.2-p320 :061 > str.
1.9.2-p320 :062 >   length
 => 3 
1.9.2-p320 :063 >
1.9.2-p320 :083 > if
1.9.2-p320 :084 >     str
1.9.2-p320 :085?>   puts '>>>'
1.9.2-p320 :086?>   end
>>>
 => nil 
1.9.2-p320 :087 >

ご覧のとおり、予約語にメッセージを送信するなどの明らかな間違いがあっても、IRBはすぐには応答しません。?ステートメントの残りを待っているというサインです。

于 2012-12-12T11:54:39.463 に答える