문제

나는 이것을 작동시키는 방법에 관심이 있습니다.

me = "this is a string"
class << me
  alias :old<< :<<
  def <<(text)
    old<<(text)
    puts "appended #{text}"
  end
end

무언가가 추가 될 때 원합니다 me 변수, 객체는 재정의 된 메소드를 사용합니다.

내가 이것을 실행하려고한다면, 나는 얻는다 syntax error, unexpected ':', expecting kEND ~에 :<<.

도움이 되었습니까?

해결책

:old<< ":old <<". 그냥 시도해보십시오 :old, 또는 정말로 원한다면 :"old<<" (그러나 그 이름을 통해 그것을 재미있게 부르십시오).

다른 팁

심볼 리터럴에서는 특정 문자 만 허용됩니다. 당신이 찾고있는:

alias :"old<<" :"<<"

다른 사람들이 이미 설명했듯이 문제는 단순히 old<< 법적 루비 식별자가 아닙니다. 속임수로 해당 이름의 메소드를 만들 수는 있지만 정상적인 방식으로 호출 할 수 없으며 연산자로 인식되지는 않습니다.

그러나 지금까지 모든 답변은 확실히 당신의 질문에 답했지만 완전히 무시했습니다. 밑에 있는 문제 : 그 방법은 처음에 이름이 없어야합니다! 그리고 이름이 없다면, 불법이라는 이름의 문제는 단순히 발생하지 않습니다.

#!/usr/bin/env ruby

require 'test/unit'
require 'stringio'
class TestOperatorDecorator < Test::Unit::TestCase
  def setup; @old_stdout, $> = $>, (@fake_stdout = StringIO.new) end
  def teardown; $> = @old_stdout end

  def test_that_me_dot_append_writes_to_stdio
    me = 'this is a string'
    class << me
      old_method = instance_method :<<

      define_method :<< do |text|
        old_method.bind(self).(text)
        puts "appended #{text}"
      end
    end

    me << 'Test'

    assert_equal "appended Test\n", @fake_stdout.string
  end
end

이 경우, 메소드는 이름을 발명 할 필요가 없다는 것을 의미 할뿐만 아니라 네임 스페이스를 오염시키지 않음을 의미합니다.

문제는 다음과 같습니다 :old<<. 그것은 다음으로 해석됩니다 :old <<, 즉 상징 :old 그 뒤에 << 연산자이므로 구문 오류입니다. 아마 당신은 시도 할 수 있습니다 :"old<<"?

나는 thenduks와 ephemient에 동의하지만, 당신은 연산자를 그런 식으로 사용한 다음 Send를 사용하여 호출 할 수 있습니다. 또한 클래스 상속을 사용할 수도 있습니다. 예 :

me = "is a string"

class << me
  def <<(text)
    super
    puts "appended #{text}"
  end
end

me << " bob"
puts me #=> is a string appended bob
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top