ruby 1.8에서 라이브러리를 이식하려고합니다. 나는 도서관을 쓰지 않았다. 절대적으로 필요한 경우 API를 변경할 수는 있지만 불편을 끼치 지 않는 사용자가 꽤 있습니다. 나는 루비 1.9 동작이 정확한지, 분명히 private method ``bar=' called for #<Foo:0x000000010a40f8> (NoMethodError)
Ruby 1.9에서 attr_accessor에서 alias_method_chain을 수행 할 때 가시성 유지
을 얻을 루비 1.8.7p174에
require 'rubygems'
require 'activesupport'
class Foo
private
def self.attr_accessor_with_magic(*attrs)
attr_accessor_without_magic(*attrs)
end
public
class << self
alias_method_chain :attr_accessor, :magic
end
attr_accessor :bar
end
foo=Foo.new
foo.bar=17
puts foo.bar
, 이것은 루비 1.9.1p243에 17
을 인쇄 : 여기
간소화 문제 야 . Ruby 1.8 버그를보다 잘 설명하려면 위의 코드에서public
을
private
으로 바꿉니다. Ruby 1.8은 여전히
17
을 인쇄합니다!
그러므로 나는 아무도 내가 옳은 일을 할 수있는 방법에 대해 어떤 생각을 가지고 있고 ATTR에 대한 적절한 가시성을 만들 수 있습니까
private
def self.attr_accessor_with_magic(*attrs)
public
attr_accessor_without_magic(*attrs)
private
end
를 작성하여 라이브러리의 현재 버전과 "버그 호환성"을 유지할 수 있습니까? 루비 1.8에서 내가하는 일은 상관없이 public
이 될 것이지만, 1.9에서 옳은 일을 할 수 있을까요?
내가 잘못 이해하고 있습니까? 라이브러리가 사용자가 사용할 수 있도록 "attr_accessor_with_magic"을 제공합니까? 아니면 Foo라는 클래스에 "bar"라는 접근자를 제공합니까? –
라이브러리는'attr_accessor'라는 메소드를 제공합니다. 그것은 모듈의'attr_accessor'와 똑같이 작동합니다. 단 두 개의 추가 옵션이 전달 될 수 있습니다. –
또는 적어도 동일하게 작동해야합니다. 하지만 그렇지 않습니다. 가시성을 유지할 수 없습니다. 따라서 질문. –