2009-11-27 3 views
0

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 버그를보다 잘 설명하려면 위의 코드에서 publicprivate으로 바꿉니다. 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에서 옳은 일을 할 수 있을까요?

답변

0

attr_accessor이 올바른 일을하지 않는다면 사용하지 않아도됩니다. 필자가 아는 한, attr_accessor :bar을 작성하는 것은 멤버 변수 @bar를 가져오고 설정하는 두 개의 공용 메서드, "bar"및 "bar ="를 정의하는 빠른 방법 일뿐입니다. 그래서 직접 대신 할 수 있고 자신 만의 맞춤 설정과 개인 정보 보호 수준을 추가 할 수 있습니다.

class Foo 
    public 
    def bar 
    reading_bar_magic() 
    return @bar 
    end 

    private 
    def bar=(value) 
    setting_bar_magic() 
    @bar=value 
    end 
end 
+0

내가 잘못 이해하고 있습니까? 라이브러리가 사용자가 사용할 수 있도록 "attr_accessor_with_magic"을 제공합니까? 아니면 Foo라는 클래스에 "bar"라는 접근자를 제공합니까? –

+0

라이브러리는'attr_accessor'라는 메소드를 제공합니다. 그것은 모듈의'attr_accessor'와 똑같이 작동합니다. 단 두 개의 추가 옵션이 전달 될 수 있습니다. –

+0

또는 적어도 동일하게 작동해야합니다. 하지만 그렇지 않습니다. 가시성을 유지할 수 없습니다. 따라서 질문. –

관련 문제