1

我看到有两种方法可以在 Ruby 中指定访问控制。一个具有使用方法指定的访问修饰符,另一个作为 ACL 函数的列表。

例如,使用方法指定的访问修饰符

class MyClass
    public
        def method1
            #...
        end
    private
        def method2
            #...
        end

end

以及将访问权限指定为 ACL 函数列表的另一种方式

class MyClass
        def method1
            #...
        end
        def method2
            #...
        end
        public :method1
        private :method2
end

有什么理由使用其中一个吗?

4

2 回答 2

1

通常,您使用您描述的第一种方法。您首先将所有公共方法组合在一起(没有public指定,因为它是开头的默认值),然后是所有受保护的方法组合在一起,最后是所有私有方法组合在一起。一个例子:

class C

  def first_public_method
    #...
  end

  def second_public_method
    #...
  end

  protected

    def protected_method_1
      #...
    end

    def protected_method_2
      #...
    end

  private

    def one_private_method
      #...
    end

    def another_private_method
      #...
    end

end

您在问题中描述的第二种方法很少使用,主要用于做一些技巧。例如,它允许您执行以下第一种方法无法完成的事情:

  • 动态构建应该具有一定可见性的方法列表,然后通过使用动态列表调用适当的方法来设置该可见性,例如public(*an_array_containing_names_of_all_methods_that_should_be_public)

  • 定义类后更改方法的可见性

上面第二点的一个例子:

class C

  #...

  private

    def a_private_method
      #...
    end

end

instance = C.new
instance.a_private_method # raises NoMethodError

C.send(:public, :a_private_method) # changes the visibility of the method dynamically to public
instance.a_private_method # executes the formerly private method without error
于 2013-08-21T14:36:58.990 回答
0

如果用方法指定修饰符,它就在方法定义中,而不是隐藏在某个地方。通常,您可以将文件底部的所有私有方法与一个private修饰符组合在一起,因为这些修饰符(例如private, public, module_function(其他?))作为“此行下方的所有内容,直到遇到一个矛盾的内容”。

或者,您可以使用方法表单,但我会将它们放置在尽可能靠近顶部的位置,这样很明显。等等,这会导致“这个方法没有定义,所以我到底是什么私有化???” 例外?在这种情况下,我会将它们分组在底部。关键是不要将它们分散在中间。

于 2013-08-21T14:15:15.677 回答