【问题标题】:Private/Protected block in Ruby?Ruby中的私有/受保护块?
【发布时间】:2010-11-02 21:57:37
【问题描述】:

Ruby 似乎没有像这样定义受保护/私有块的工具:

protected do
  def method
  end
end

这个比较好

protected 

def method 
end 

public

您可能会忘记在受保护的方法之后“公开”。

似乎可以使用元编程来实现这一点。有什么想法吗?

【问题讨论】:

    标签: ruby access-specifier


    【解决方案1】:

    由于您想按功能分组,您可以声明所有方法,然后使用 protected 后跟要保护的方法的符号来声明哪些方法是受保护的和私有的,私有方法也是如此。

    下面的课程说明了我的意思。在这个类中,所有方法都是公共的,除了 bar_protected 和 bar_private 被声明为 protected 和 private。

    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
    

    【讨论】:

    • 我决定接受这个作为答案,因为这就是 Ruby 的定义方式。我假设对受保护的块进行元编程应该很容易,但显然并非如此。而且,在您可以通过测试确认它有效之前,最好不要进行元编程。不过,感谢 Chuck 尝试解决这个问题 :)
    • 似乎私有和受保护的应该是块。我想知道为什么他们没有。
    • 我赞同@RyanHeneise 所说的话 - 有没有人能够提供关于这个约定的更多见解?
    【解决方案2】:

    我实际上赞同 bodnarbm 的解决方案并且不建议这样做,但由于我无法放弃元编程挑战,这里有一个可以完成此任务的 hack:

    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
    

    【讨论】:

      猜你喜欢
      • 2012-01-09
      • 2016-10-23
      • 1970-01-01
      • 2015-08-11
      • 2011-07-09
      • 2014-04-26
      • 1970-01-01
      • 2012-05-06
      • 2011-08-18
      相关资源
      最近更新 更多