루비 운영자가 별명을 할 수 있습니까?
-
05-07-2019 - |
문제
나는 이것을 작동시키는 방법에 관심이 있습니다.
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