Ruby Language
イントロスペクション
サーチ…
オブジェクトのメソッドを表示する
オブジェクトの検査
methods
またはpublic_methods
メソッドを使用してオブジェクトが応答できるパブリックメソッドを見つけることができます。このメソッドは、シンボルの配列を返します。
class Foo
def bar; 42; end
end
f = Foo.new
def f.yay; 17; end
p f.methods.sort
#=> [:!, :!=, :!~, :<=>, :==, :===, :=~, :__id__, :__send__, :bar, :class, :clone,
#=> :define_singleton_method, :display, :dup, :enum_for, :eql?, :equal?, :extend,
#=> :freeze, :frozen?, :hash, :inspect, :instance_eval, :instance_exec,
#=> :instance_of?, :instance_variable_defined?, :instance_variable_get,
#=> :instance_variable_set, :instance_variables, :is_a?, :itself, :kind_of?,
#=> :method, :methods, :nil?, :object_id, :private_methods, :protected_methods,
#=> :public_method, :public_methods, :public_send, :remove_instance_variable,
#=> :respond_to?, :send, :singleton_class, :singleton_method, :singleton_methods,
#=> :taint, :tainted?, :tap, :to_enum, :to_s, :trust, :untaint, :untrust,
#=> :untrusted?, :yay]
ターゲットを絞り込んだリストの場合は、すべてのオブジェクトに共通のメソッドを削除することができます。
p (f.methods - Object.methods).sort
#=> [:bar,:yay]
代わりに、 methods
やpublic_methods
false
を渡すこともできます:
p f.methods(false) # public and protected singleton methods of `f`
#=> [:yay]
p f.public_methods(false)
#=> [:yay, :bar]
private_methods
とprotected_methods
を使用して、オブジェクトのprivateメソッドとprotectedメソッドを見つけることができます。
p f.private_methods.sort
#=> [:Array, :Complex, :DelegateClass, :Float, :Hash, :Integer, :Rational, :String,
#=> :__callee__, :__dir__, :__method__, :`, :abort, :at_exit, :autoload, :autoload?,
#=> :binding, :block_given?, :caller, :caller_locations, :catch,
#=> :default_src_encoding, :eval, :exec, :exit, :exit!, :fail, :fork, :format, :gem,
#=> :gem_original_require, :gets, :global_variables, :initialize, :initialize_clone,
#=> :initialize_copy, :initialize_dup, :irb_binding, :iterator?, :lambda, :load,
#=> :local_variables, :loop, :method_missing, :open, :p, :print, :printf, :proc,
#=> :putc, :puts, :raise, :rand, :readline, :readlines, :require, :require_relative,
#=> :respond_to_missing?, :select, :set_trace_func, :singleton_method_added,
#=> :singleton_method_removed, :singleton_method_undefined, :sleep, :spawn,
#=> :sprintf, :srand, :syscall, :system, :test, :throw, :trace_var, :trap,
#=> :untrace_var, :warn]
p f.protected_methods
#=> []
methods
とpublic_methods
場合とpublic_methods
、 private_methods
とprotected_methods
にfalse
を渡して、継承protected_methods
れたmethods
をpublic_methods
することができます。
クラスまたはモジュールの検査
methods
、 public_methods
、 protected_methods
、およびprivate_methods
、クラスおよびモジュールは、クラスまたはモジュールから継承したオブジェクトに対して公開されるメソッドを決定するために、 instance_methods
、 public_instance_methods
、 protected_instance_methods
、およびprivate_instance_methods
を公開します。上記のように、これらのメソッドにfalse
を渡して、継承されたメソッドを除外することができます。
p Foo.instance_methods.sort
#=> [:!, :!=, :!~, :<=>, :==, :===, :=~, :__id__, :__send__, :bar, :class,
#=> :clone, :define_singleton_method, :display, :dup, :enum_for, :eql?,
#=> :equal?, :extend, :freeze, :frozen?, :hash, :inspect, :instance_eval,
#=> :instance_exec, :instance_of?, :instance_variable_defined?,
#=> :instance_variable_get, :instance_variable_set, :instance_variables,
#=> :is_a?, :itself, :kind_of?, :method, :methods, :nil?, :object_id,
#=> :private_methods, :protected_methods, :public_method, :public_methods,
#=> :public_send, :remove_instance_variable, :respond_to?, :send,
#=> :singleton_class, :singleton_method, :singleton_methods, :taint,
#=> :tainted?, :tap, :to_enum, :to_s, :trust, :untaint, :untrust, :untrusted?]
p Foo.instance_methods(false)
#=> [:bar]
あなたが将来的にこれらのほとんどの名前を忘れてしまった場合は最後に、あなたが使用して、これらの方法のすべてを見つけることができますmethods
:
p f.methods.grep(/methods/)
#=> [:private_methods, :methods, :protected_methods, :public_methods,
#=> :singleton_methods]
p Foo.methods.grep(/methods/)
#=> [:public_instance_methods, :instance_methods, :private_instance_methods,
#=> :protected_instance_methods, :private_methods, :methods,
#=> :protected_methods, :public_methods, :singleton_methods]
オブジェクトのインスタンス変数を表示する
instance_variables
、 instance_variable_defined?
を使用して、インスタンス変数についてオブジェクトに問い合わせることは可能instance_variable_defined?
、およびinstance_variable_get
を変更し、 instance_variable_set
およびremove_instance_variable
を使用してそれらを変更しinstance_variable_set
。
class Foo
attr_reader :bar
def initialize
@bar = 42
end
end
f = Foo.new
f.instance_variables #=> [:@bar]
f.instance_variable_defined?(:@baz) #=> false
f.instance_variable_defined?(:@bar) #=> true
f.instance_variable_get(:@bar) #=> 42
f.instance_variable_set(:@bar, 17) #=> 17
f.bar #=> 17
f.remove_instance_variable(:@bar) #=> 17
f.bar #=> nil
f.instance_variables #=> []
インスタンス変数の名前には@
記号が含まれます。省略するとエラーになります:
f.instance_variable_defined?(:jim)
#=> NameError: `jim' is not allowed as an instance variable name
グローバル変数とローカル変数の表示
Kernel
はglobal_variables
とlocal_variables
リストを取得するためのメソッドを公開しています:
cats = 42
$demo = "in progress"
p global_variables.sort
#=> [:$!, :$", :$$, :$&, :$', :$*, :$+, :$,, :$-0, :$-F, :$-I, :$-K, :$-W, :$-a,
#=> :$-d, :$-i, :$-l, :$-p, :$-v, :$-w, :$., :$/, :$0, :$1, :$2, :$3, :$4, :$5,
#=> :$6, :$7, :$8, :$9, :$:, :$;, :$<, :$=, :$>, :$?, :$@, :$DEBUG, :$FILENAME,
#=> :$KCODE, :$LOADED_FEATURES, :$LOAD_PATH, :$PROGRAM_NAME, :$SAFE, :$VERBOSE,
#=> :$\, :$_, :$`, :$binding, :$demo, :$stderr, :$stdin, :$stdout, :$~]
p local_variables
#=> [:cats]
インスタンス変数とは異なり、グローバル変数やローカル変数を取得、設定、削除するためのメソッドは特にありません。このような機能を探すことは、通常、値を格納するためにハッシュを使用するようにコードを書き直さなければならないという兆候です。ただし、グローバル変数またはローカル変数を名前で変更する必要がある場合は、 eval
に文字列を使用できます。
var = "$demo"
eval(var) #=> "in progress"
eval("#{var} = 17")
p $demo #=> 17
デフォルトでは、 eval
は現在のスコープ内の変数を評価します。別のスコープでローカル変数を評価するには、ローカル変数が存在する場所でバインディングを取得する必要があります。
def local_variable_get(name, bound=nil)
foo = :inside
eval(name,bound)
end
def test_1
foo = :outside
p local_variable_get("foo")
end
def test_2
foo = :outside
p local_variable_get("foo",binding)
end
test_1 #=> :inside
test_2 #=> :outside
上記において、 test_1
に結合する合格しなかったlocal_variable_get
などeval
ローカル変数命名その方法のコンテキスト内で実行されたfoo
に設定した:inside
。
クラス変数の表示
クラスとモジュールには、インスタンス変数を他のオブジェクトと同様にイントロスペクションするための同じメソッドがあります。クラスとモジュールには、クラス変数( @@these_things
)を照会するための同様のメソッドもあります。
p Module.methods.grep(/class_variable/)
#=> [:class_variables, :class_variable_get, :remove_class_variable,
#=> :class_variable_defined?, :class_variable_set]
class Foo
@@instances = 0
def initialize
@@instances += 1
end
end
class Bar < Foo; end
5.times{ Foo.new }
3.times{ Bar.new }
p Foo.class_variables #=> [:@@instances]
p Bar.class_variables #=> [:@@instances]
p Foo.class_variable_get(:@@instances) #=> 8
p Bar.class_variable_get(:@@instances) #=> 8
インスタンス変数と同様に、クラス変数の名前は@@
で始まらなければなりません。そうしないとエラーになります:
p Bar.class_variable_defined?( :instances )
#=> NameError: `instances' is not allowed as a class variable name