我看到了在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有什么理由用一种而另一种?
发布于 2013-08-21 14:36:58
通常,您使用您描述的第一种方法。首先将所有公共方法分组在一起(没有指定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-21 14:15:15
如果用方法指定修饰符,那么它就在那里,有方法定义,而不是隐藏在某个地方。通常,您可以将文件底部的所有私有方法分组为一个private修饰符,如private、public、module_function (其他?)做“这条线下的每一件事,直到遇到矛盾的事情”。
或者,您可以使用方法表单,但是我会尽可能地将它们放置在顶部,这样就很明显了。等等,这会导致“这个方法没有定义,那么我到底是什么隐私?”例外?在这种情况下,我会把他们分组在底部。关键是不要把它们分散在中间。
https://stackoverflow.com/questions/18358442
复制相似问题