Ruby には、次のように保護/プライベート ブロックを定義する機能がないようです。
protected do
def method
end
end
比べたらこれはいいだろう
protected
def method
end
public
保護されたメソッドの後に「公開」するのを忘れるかもしれません。
これは、メタプログラミングを使用して実装できるようです。どのようにアイデアはありますか?
Ruby には、次のように保護/プライベート ブロックを定義する機能がないようです。
protected do
def method
end
end
比べたらこれはいいだろう
protected
def method
end
public
保護されたメソッドの後に「公開」するのを忘れるかもしれません。
これは、メタプログラミングを使用して実装できるようです。どのようにアイデアはありますか?
機能ごとにグループ化したいので、すべてのメソッドを宣言してから、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
私は実際に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