Suche…


Zeigen Sie die Methoden eines Objekts an

Objekt prüfen

Sie finden die öffentlichen Methoden, auf die ein Objekt reagieren kann, entweder mit den methods oder mit den methods public_methods , die ein Array von Symbolen zurückgeben:

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]

Für eine gezieltere Liste können Sie Methoden entfernen, die allen Objekten gemeinsam sind, z

p (f.methods - Object.methods).sort
#=> [:bar,:yay]

Alternativ können Sie false an methods oder public_methods :

p f.methods(false) # public and protected singleton methods of `f`
#=> [:yay]

p f.public_methods(false)
#=> [:yay, :bar]

Sie können die privaten und geschützten Methoden eines Objekts mit private_methods und protected_methods :

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
#=> []

Wie bei methods und public_methods können Sie false an private_methods und protected_methods , um geerbte Methoden private_methods .

Prüfung einer Klasse oder eines Moduls

Neben methods , public_methods , protected_methods und private_methods , Klassen und Module aussetzen instance_methods , public_instance_methods , protected_instance_methods und private_instance_methods die Methoden für die Objekte ausgesetzt , um zu bestimmen , die von der Klasse oder dem Modul erben. Wie oben können Sie den Methoden false zuweisen, um geerbte Methoden auszuschließen:

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]

Wenn Sie die Namen der meisten dieser Elemente in der Zukunft vergessen, können Sie alle Methoden mithilfe von 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]

Zeigen Sie die Instanzvariablen eines Objekts an

Es ist möglich , ein Objekt über seine Instanzvariablen abfragen instance_variables , instance_variable_defined? und instance_variable_get und ändern Sie sie mithilfe von instance_variable_set und remove_instance_variable :

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                #=> []

Die Namen der Instanzvariablen enthalten das @ -Symbol. Sie erhalten eine Fehlermeldung, wenn Sie sie weglassen:

f.instance_variable_defined?(:jim)
#=> NameError: `jim' is not allowed as an instance variable name

Globale und lokale Variablen anzeigen

Der Kernel stellt Methoden zum global_variables der Liste global_variables und 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, :$:, :$;, :$<, :$=, :$>, :$?, :[email protected], :$DEBUG, :$FILENAME,
#=>  :$KCODE, :$LOADED_FEATURES, :$LOAD_PATH, :$PROGRAM_NAME, :$SAFE, :$VERBOSE,
#=>  :$\, :$_, :$`, :$binding, :$demo, :$stderr, :$stdin, :$stdout, :$~]

p local_variables
#=> [:cats]

Im Gegensatz zu Instanzvariablen gibt es keine speziellen Methoden, um globale oder lokale Variablen abzurufen, festzulegen oder zu entfernen. Die Suche nach einer solchen Funktionalität ist normalerweise ein Zeichen dafür, dass Ihr Code umgeschrieben werden muss, um einen Hash zum Speichern der Werte zu verwenden. Wenn Sie jedoch globale oder lokale Variablen nach Namen ändern müssen, können Sie eval mit einer Zeichenfolge verwenden:

var = "$demo"
eval(var)           #=> "in progress"
eval("#{var} = 17")
p $demo             #=> 17

Standardmäßig wertet eval Ihre Variablen im aktuellen Bereich aus. Um lokale Variablen in einem anderen Bereich auszuwerten, müssen Sie die Bindung erfassen, in der die lokalen Variablen vorhanden sind.

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

Im obigen test_1 hat test_1 keine Bindung an local_variable_get , und daher wurde das eval im Kontext dieser Methode ausgeführt, wobei eine lokale Variable mit dem Namen foo auf local_variable_get gesetzt wurde :inside

Klassenvariablen anzeigen

Klassen und Module verfügen über die gleichen Methoden für die Introspektion von Instanzvariablen wie jedes andere Objekt. Klassen und Module verfügen auch über ähnliche Methoden zum Abfragen der Klassenvariablen ( @@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

Ähnlich wie bei Instanzvariablen muss der Name von Klassenvariablen mit @@ beginnen, oder Sie erhalten einen Fehler:

p Bar.class_variable_defined?( :instances )
#=> NameError: `instances' is not allowed as a class variable name


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow