당신은 인스턴스에 메서드를 추가 할 수 있지만이 방법 체인 농구 대를 통해 이동할 필요 해요 :
str = 'now is the time'
def str.foo(target, replacement)
self.gsub(target, replacement)
end
def str.bar
self.reverse
end
str.singleton_methods # => [:foo, :bar]
str.foo('ow', 'ever') # => "never is the time"
str.bar # => "emit eht si won"
이 작동하지 않습니다 :
str.foo('ow', 'ever').bar
# ~> NoMethodError
# ~> undefined method `bar' for "never is the time":String
"bang"형식의 메서드를 사용하면 원래의 개체를 변형 할 수 있습니다.
str = 'now is the time'
def str.foo(target, replacement)
self.gsub!(target, replacement)
self
end
def str.bar
self.reverse!
self
end
str.singleton_methods # => [:foo, :bar]
str.foo('ow', 'ever').bar # => "emit eht si reven"
비록주의해야합니다. 이것은 모든 유형의 객체에서 작동하지 않으며, 변이를 허용하는 객체에서만 작동합니다.
그리고 추가 된 메서드가 특정 변수에서만 사용 가능하다는 사실은 실제로 제한적입니다. 동일한 기능을 재사용하는 것이 지저분합니다. 당신은 변수를 clone
새로운 변수에 그 클론을 할당하지만 다른 뭔가 값을 대체하는 것은 혼란하게 할 수 있습니다 개인적으로
str2 = str.clone
str.object_id # => 70259449706680
str2.object_id # => 70259449706520
str.singleton_methods # => [:foo]
str2.singleton_methods # => [:foo]
str2 = 'all good men'
str2.foo('ll', '') # =>
# ~> NoMethodError
# ~> undefined method `foo' for "all good men":String
, 나는 서브 클래스를 통해 그것을 할 것 :
class MyString < String
def foo(s, t)
self.gsub(s, t)
end
end
str = MyString.new('now is the time')
str.foo('ow', 'ever') # => "never is the time"
str2 = 'all good men'
str2.foo('ll', '') # =>
# ~> NoMethodError
# ~> undefined method `foo' for "all good men":String
Ruby v2 +를 사용하는 경우 구체화를 사용하여 @ mdesantis의 대답을 살펴보십시오. 이런 종류의 문제를 해결하기 위해 도입되었습니다. < v2.0 인 경우 하위 클래스 경로로 이동하거나 String을 수정해야합니다. 루비> = 2.0을 사용하는 경우
항상 인스턴스에 추가 할 수 있습니다. –
@DaveNewton 할 수 있습니다. 그러나 이러한 모든 변환이 동일하므로 비용이 많이 듭니다. –
... 그런 다음 문자열에 추가하거나 "우려"구현을 사용하십시오. 조금 비싸기도합니다. –