Ruby Language
루비에서 원숭이 패치
수색…
소개
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