9

Ruby には、次のように保護/プライベート ブロックを定義する機能がないようです。

protected do
  def method
  end
end

比べたらこれはいいだろう

protected 

def method 
end 

public

保護されたメソッドの後に「公開」するのを忘れるかもしれません。

これは、メタプログラミングを使用して実装できるようです。どのようにアイデアはありますか?

4

2 に答える 2

18

機能ごとにグループ化したいので、すべてのメソッドを宣言してから、protected の後に保護したいメソッドのシンボルを続けて使用することで、どのメソッドが保護され、プライベートであるかを宣言できます。プライベートの場合も同様です。

次のクラスは、私が何を意味するかを示しています。このクラスでは、最後に保護およびプライベートと宣言されている bar_protected と bar_private を除いて、すべてのメソッドが public です。

class Foo

  def bar_public
    print "This is public"
  end

  def bar_protected
    print "This is protected"
  end

  def bar_private
    print "This is private"
  end

  def call_protected
    bar_protected
  end

  def call_private
    bar_private
  end

  protected :bar_protected

  private :bar_private

end
于 2009-06-15T02:33:54.847 に答える
9

私は実際にbodnarbmのソリューションを支持しており、これを行うことはお勧めしませんが、メタプログラミングの課題を見逃すことはできないため、これを達成するためのハックを次に示します。

class Module
  def with_protected
    alias_if_needed = lambda do |first, second|
      alias_method first, second if instance_methods.include? second
    end
    metaclass = class<<self; self end
    metaclass.module_eval {|m| alias_if_needed[:__with_protected_old__, :method_added]}
    def self.method_added(method)
      protected method
      send :__with_protected_old__ if respond_to? :__with_protected_old__
    end
    yield
    metaclass.module_eval do |m|
      remove_method :method_added
      alias_if_needed[:method_added, :__with_protected_old__]
    end
  end
end
于 2009-06-15T08:20:01.780 に答える