Rubyのすべてがオブジェクトであり、irbを開いて次のよう4.class
に入力"Text".class
し、オブジェクトがどのクラスからのものであるかを確認できることを考えると、なぜ戻り値if.class
を与えないのでしょうか。unless.class
3 に答える
Rubyのすべてがオブジェクトであることを考えると
それはあなたの「オブジェクト」とすべての「もの」の定義に依存します。「オブジェクト」とは、「プログラムで操作できるエンティティ」(これからオブジェクトと呼びます)、または「オブジェクトシステムのメンバーである値」 (これから呼びます)を意味Object
します。
Rubyでは、プログラム(つまり、すべてのオブジェクト)で操作できるものはすべてObject
、つまりクラスのインスタンスでもあります。これは、たとえば、プリミティブをプログラムで操作できる(つまり、その意味でのオブジェクトObjects
である)Javaとは異なりますが、そうではありません。Rubyでは、この区別は存在しません。すべてのオブジェクトはでありObject
、すべてはオブジェクトObject
でもあります。
ただし、言語には、プログラムで操作できず、クラスのインスタンスではないものがあります。つまり、オブジェクトでもオブジェクトでもありません。これらは、たとえば、メソッド、変数、構文、パラメーターリスト、引数リスト、キーワードです。Object
注:RubyのリフレクションAPIを使用して、メソッドまたはパラメーターリストを表すオブジェクトを提供できますが、そのオブジェクトは単なるプロキシであり、本物ではありません。
つまり、「すべてがオブジェクトである」と言うとき、私たちが実際に意味するのは、「すべてのオブジェクトがObject
」であるということです。つまり、プログラムによって操作できるすべてのものがオブジェクトシステムのメンバーでもある、つまり、オブジェクトシステムの外部の値はありません(Javaのプリミティブとは異なります)。言語に存在するすべてのものが実行時にプログラムによって操作できることを意味するものではありません。
なぜそうし、戻り値
if.class
を与えないのかunless.class
まず最初に、オブジェクトであったとしても 、それらはあなたが思っていることをしません。Rubyのように言うとき、それは「ローカル変数を逆参照する」または「暗黙のレシーバーとしてメソッドを呼び出す」ことを意味します。引数リストなし」。それで、if
foo
foo
foo
self
if.class
ローカル変数によって参照if
されるオブジェクトのクラスまたはメソッドによって返されるオブジェクトのクラスのいずれかを提供しますがif
、それ自体のクラスは提供しませんif
。
ただし、Rubyではキーワードと制御フローはオブジェクトではないため、if
制御フローのキーワードはオブジェクトではありません(オブジェクトでも)でもありません。Object
MatzとDavidFlanaganによる本TheRubyProgramming Languageの中で、 2ページに書かれています。
すべての値はオブジェクトです
すべてを言っているのではなく、すべての値だけを言っていることに注意してください。
それらは言語のキーワードであり、オブジェクトではないからです。一般に、変数に割り当てることができるものはすべてオブジェクトです。
技術的に正確に言うと、などのキーワードには、コンパイラ/インタプリタによって使用されるクラスが含まれているunless
可能性がありますが(実際の実装によって異なります)、言語ユーザーとしては、リモートで実際に使用することすらできないため、そうではありません。あなたにさらされた。
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はすぐには応答しません。?ステートメントの残りを待っているというサインです。