수색…


소개

Monkey Patching은 Ruby에서 클래스를 수정하고 확장하는 방법입니다. 기본적으로 Ruby에서 이미 정의 된 클래스를 수정하고 새로운 메소드를 추가하며 이전에 정의 된 메소드를 수정할 수도 있습니다.

비고

원숭이 패치는 종종 예를 들어 보석에서 기존 루비 코드의 동작을 변경하는 데 사용됩니다.

예를 들어, 이 요지를 참조하십시오.

또한 Rails가 ActiveSupport와 같은 기존 루비 클래스를 확장하는 데 사용할 수 있습니다. 여기에 그 예가 나와 있습니다.

어떤 방법 바꾸기

def hello
  puts "Hello readers"
end

hello # => "Hello readers"

def hello
  puts "Hell riders"
end

hello # => "Hell riders"

기존 루비 메소드 변경하기

puts "Hello readers".reverse # => "sredaer olleH"

class String
  def reverse
    "Hell riders"
  end
end

puts "Hello readers".reverse # => "Hell riders"

매개 변수로 메소드 변경

재정의하는 메소드와 완전히 동일한 컨텍스트에 액세스 할 수 있습니다.

class Boat
  def initialize(name)
    @name = name
  end

  def name
    @name
  end
end

puts Boat.new("Doat").name # => "Doat"

class Boat
  def name
    "⛵ #{@name} ⛵"
  end
end

puts Boat.new("Moat").name # => "⛵ Moat ⛵"

기존 클래스 확장하기

class String
  def fancy
    "~~~{#{self}}~~~"
  end
end

puts "Dorian".fancy # => "~~~{Dorian}~~~"

세분화 된 안전한 원숭이 패치

Ruby 2.0부터 Ruby는 세련된 Monkey Patching을 사용할 수 있습니다. 기본적으로 Monkey Patched 코드가 요청 될 때만 적용되도록 제한합니다.

먼저 모듈에서 상세 검색을 만듭니다.

module RefiningString
  refine String do
    def reverse
      "Hell riders"
    end
  end
end

그런 다음 사용할 위치를 결정할 수 있습니다.

class AClassWithoutMP   
  def initialize(str)
    @str = str
  end
   
  def reverse
    @str.reverse
  end
end

class AClassWithMP
  using RefiningString

  def initialize(str)
    @str = str
  end
   
  def reverse
    str.reverse
  end
end

AClassWithoutMP.new("hello".reverse # => "olle"
AClassWithMP.new("hello").reverse # "Hell riders"


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