수색…


객체의 메소드보기

객체 검사하기

객체가 응답 할 수있는 public 메소드는 심볼 배열을 반환하는 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_methodsprotected_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
#=> []

methodspublic_methods 와 마찬가지로 private_methodsprotected_methodsfalse 를 전달하여 상속 된 메서드를 제거 할 수 있습니다.

클래스 또는 모듈 검사

methods , public_methods , protected_methodsprivate_methods 외에도 클래스 및 모듈은 instance_methods , public_instance_methods , protected_instance_methodsprivate_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_setremove_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                #=> []

인스턴스 변수의 이름에는 @ 기호가 포함됩니다. 생략하면 오류가 발생합니다.

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

전역 변수 및 지역 변수보기

Kernelglobal_variableslocal_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_1local_variable_get 바인딩을 전달하지 않으므로 foo 라는 로컬 변수가 :inside 로 설정된 해당 메소드의 컨텍스트에서 eval 이 실행되었습니다.

클래스 변수보기

클래스와 모듈은 인스턴스 변수를 다른 객체처럼 인트로 스팅하기위한 동일한 메소드를 가지고 있습니다. 클래스와 모듈은 클래스 변수 ( @@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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow