Seongsiks

Being A DevOpser. Powered by
Obtvse, highlight.js, theme toc Creative Commons License
Seongsiks Twitter Github Email
DevOps Ruby On Rails Chef Projects Misc Movies & Drama ME

Ruby Advance 1 (self, class_eval, instance_eval)

Overview

ruby에 대해서 더 심화된 개념 정리, 특히 self, class_eval, instance_eval정리

self

self는 그 사용 위치에 따라서 지칭하는 것이 달라진다.

puts self
# => main
class MyRuby
  puts self
  # => MyRuby
end

class method

클래스 안에서 self로 시작하여 메소드를 선언하면 이것은 class method가 된다.

class MyRuby
  def self.find(key) # == def MyRuby.find(key)
     ...
  end
end

instance method

인스턴스 메소드 안에서 self는 인스턴스 자신을 가리킨다.

class MyRuby
  def find(key)
     puts self
     # => #<MyRuby:0x007f8c222de488>
  end
end

class_eval

컨텍스트를 해당 클래스 안에 있는 것처럼 만든다. 클래스 오바라이드.

MyRuby.class_eval do 
  attr_accessor :version
end

myRuby = MyRuby.new
myRuby.version = "2.0.0"

class_eval을 이용한 로깅 클레스

class MethodLogger
   def log_method(klass, method_name)
     klass.class_eval do
       alias_method "#{method_name}_original", method_name
       # 파라미터로 *args와 &block을 받아둔다.
       define_method method_name do |*args, &block|
         puts "#{Time.now}: Called #{method_name}"
         # 오리지날 클래스를 부를때 받아둔 *args와 &block을 같이 준다.
         send "#{method_name}_original", *args, &block
       end
     end
   end
end

instance_eval

class MyRuby
  attr_accessor :version
  def initialize(&block) 
    instance_eval(&block) if block_given?
  end
end

MyRuby.new do
  self.version = "2.0.0"
  puts self.version
end
comments powered by Disqus
Back to Ruby On Rails