2016-03-31 10 views
0

モジュールで定義されている構造(メソッド、定数など)を調べるにはどうすればよいですか?モジュールの検査方法

require 'observer'があるとしましょう。私は「オブザーバー」内で定義されているすべてを見たいと思います。どうやって?

+0

'puts'または' inspect'が、残念ながら、表示されません。 –

+0

あなたの質問は不明です。あなたはモジュールではなく、ファイルを 'require'します。ファイルの内容を見たい場合は、ファイルを開いて印刷するだけです。 –

答えて

1

あなたはプライを使用する場合は、単に

lsls ModuleNameは、特定のモジュールまたはクラスまたはインスタンスの使用可能なすべてのメソッドとインスタンス変数を示していません。てこについての詳細:http://pryrepl.org/

それとも、別の答えが述べているようにinstance_variablesに

を取得するためにinstance_methods

ModuleName.instance_variablesを取得するために

ModuleName.instance_methodsを行うことができ、それがに(脆性の方法で、まだなんとか)はほとんど不可能ですrequire

こんにちは、この種の実装自体はbrです。あなた自身のモジュールとあなたがAPIを完全にコントロールしていない限り、エラーが発生しやすくなります。しかし、まだ良い考えではありません。

+0

任意の 'require'のモジュール名は何ですか? – tadman

+0

私はあなたがモジュールがルビーの規約に従っていて、その名前が 'Observer 'であると仮定できると思います。しかし、それは確かではありません。 –

+0

このようなことを前提とすると、基本的にはモジュールが他に何も定義していないこと、そして全てが前にロードされていること、遅れていない、または遅延評価されていないことなどが期待されます。ほとんどの宝石、特に古いものは驚きでいっぱいです。 – tadman

2

短い答え:絶対確実ではありません。

長い答え:これは、Rubyがコアで非常に動的な言語であり、require文が行う可能性のあることにほとんど制約を課さない方法の製品です。任意の数のモジュールとクラスをライブラリで作成することができ、これらをきちんとまとめてグループ化する必要はありません。

定義済みのすべてのクラスとメソッドを必要とする前にスナップショットを作成し、追加されたものを見つけるために別のものを取得しても、それらをすべて取得したという保証はありません。いくつかのクラスは、requireステートメントが終了した後に読み込まれたり、定義されたりすることがあります。

最も良い方法は、ソースを読み取ることです。 である可能性がある、さまざまなモジュールとクラスが、コードによってトリガーされていない場合でも定義されます。

methodsのような反射ツールが助けになりますが、それはまた誤解を招くほどです。メソッドは後で定義することができます。コードをより完全に表示して表示する必要があります。

0

検査するモジュールの外側からObserverメソッドを実行したいとします。あなたが何をするかの例がここにあります。

module Observer 
    def self.show_all(mod) 
    puts "owner of methods = #{mod.methods(false)}" 
    puts "owner of instance methods = #{mod.instance_methods(false)}" 
    puts "instance variables = #{mod.instance_variables}" 
    puts "ancestors = #{mod.ancestors}" 
    puts "included modules = #{mod.included_modules}" 
    end 
end 

module A 
    module B 
    include Comparable 
    @a = 1 
    def self.b; end 
    def c; end 
    module C 
    end 
    end 
end 

Observer.show_all(A::B) 
    # owner of methods = [:b] 
    # owner of instance methods = [:c] 
    # instance variables = [:@a] 
    # ancestors = [A::B, Comparable] 
    # included modules = [Comparable] 

class D; end 
class E<D; end 
class F<E 
    include Comparable 
    @a = 1 
    def self.e; end 
    def f; end 
end 

Observer.show_all(F) 
    # owner of methods = [:e] 
    # owner of instance methods = [:f] 
    # instance variables = [:@a] 
    # ancestors = [F, Comparable, E, D, Object, Kernel, BasicObject] 
    # included modules = [Comparable, Kernel] 
0

質問が間違っていると分かりません。

このようにして、Moduleのプロパティを読み取ることができます。

例:

第一バージョン:

require "nokogiri" 
p Nokogiri.methods # It will print for you all methods in that Module, 
        # also available methods from ruby. 

セカンドバージョン

x = require "nokogiri" 
p x.methods #available methods there private, public, protected methods and etc... 
p x.private_methods # prints bunch of private methods, [:Nokogiri] 
関連する問題