5

Rubyを説明するテキストを読んでいて、次のように書かれていました。

Rubyは、Rubyプログラムがそれ自体を分析し(構成の観点から)、動作方法を調整し、さらには独自のコードを他のコードで上書きする可能性があるため、「反射」言語と見なされます。

私はこの用語「反射的」と混同しています-これは主に、Rubyが変数を調べて、それが整数か文字列か(ダックタイピング)を判断する方法について話しているものです。例:

x = 3
x = "three" # Ruby reassigns x to a String type
4

4 に答える 4

10

Rubyが「リフレクティブ」であると言うことは、たとえば、実行時にクラスにあるメソッドを見つけることができることを意味します。

>> Array.methods
=> ["inspect", "private_class_method", "const_missing",
[ ... and many more ... ]

(クラスのオブジェクトでも同じことができます。)

または、特定のオブジェクトがどのクラスであるかを確認できます...

>> arr = Array.new
=> []
>> arr.class
=> Array

そして、それがクラス階層内にあるものを見つけてください...

>> arr.kind_of?
>> arr.kind_of? Array
=> true
>> arr.kind_of? String
=> false

彼らが「Rubyプログラムがそれ自体を分析することは可能である」と言っている引用では、それが彼らが話していることです。

Javaのような他の言語もそれを行いますが、Rubyを使用すると、言語を使用する上でより簡単で便利になり、日常的な部分になります。したがって、Rubyは「反射的」です。

于 2009-02-13T18:11:27.817 に答える
3

いいえ、それは、Ruby コマンドを発行して、まあ、ほぼすべての情報を取得できることを意味します。たとえば、コマンド File.methods() を入力して、File モジュールに属するすべてのメソッドのリストを取得できます。メソッドや変数のリストなど、クラスやオブジェクトでも同様のことができます。

于 2009-02-13T18:03:33.267 に答える
1

授業再開はその好例です。簡単な例を次に示します。

class Integer
    def moxy
        if self.zero?
            self - 2
        elsif self.nonzero?
            self + 2          
        end      
    end  
end

puts 10.moxy

標準の Ruby クラスである Integer を再度開き、その中に「moxy」と呼ばれる新しいメソッドを定義することで、新しく定義された演算を数値に対して直接実行できます。この場合、整数がゼロの場合は 2 を減算し、ゼロでない場合は 2 を加算するように、この構成された「moxy」メソッドを定義しました。これにより、Ruby のクラス Integer のすべてのオブジェクトで moxy メソッドを使用できるようになります。(ここでは、'self' キーワードを使用して整数オブジェクトの内容を取得します)。

ご覧のとおり、これは Ruby の非常に強力な機能です。

編集: 一部のコメンターは、これが本当に反射であるかどうかを疑問視しています。リフレクションという言葉は、英語で自分の考えを見つめることを意味します。そして、これは確かにプログラミングにおけるリフレクションの重要な側面でもあります - is_a、kind_of、instance_of などの Ruby メソッドを使用して実行時の自己検査を実行します。ただし、リフレクションは、プログラムが実行時に独自の動作を変更する機能も指します。クラスの再開は、この重要な例の 1 つです。モンキーパッチとも呼ばれます。リスクがないわけではありませんが、私がここで行っているのは、ここで反射のコンテキストで説明しているだけであり、その例です.

于 2009-02-13T18:23:41.343 に答える
0

主に、クラス、定数、メソッドなど、Ruby プログラムの実行時に内部表現を簡単に検査および変更できることを指します。

最近のほとんどの言語は、何らかのリフレクション機能 (Java などの静的に型付けされたものも含む) を提供しますが、Ruby では、これらの機能を使用するのは非常に簡単で自然であるため、必要なときに実際に違いが生じます。

たとえば、メタプログラミングをほとんど些細なタスクにするだけであり、これは他の言語ではまったく当てはまりません。

于 2009-02-13T18:37:19.533 に答える