Ruby 中的私有模块方法
我有一个由两部分组成的问题
最佳实践
- 我有一种算法,可以使用公共接口对数据结构执行一些操作
- 它目前是一个具有许多静态方法的模块,除了一个公共接口之外,所有静态方法都是私有的方法。
- 有一个实例变量需要在所有方法之间共享。
这些是我能看到的选项,哪个是最好的?:
- Module 带有静态(ruby 中的“module”)方法
- Class 带有静态方法
- Mixin > 用于包含到数据结构中的模块
- 重构修改该数据结构的算法部分(非常小),并使其成为调用算法模块的静态方法的混合
技术部分
有没有办法制作私有模块方法?
module Thing
def self.pub; puts "Public method"; end
private
def self.priv; puts "Private method"; end
end
其中的private
似乎没有任何效果,我仍然可以毫无问题地调用Thing.priv
。
I have a two part question
Best-Practice
- I have an algorithm that performs some operation on a data structure using the public interface
- It is currently a module with numerous static methods, all private except for the one public interface method.
- There is one instance variable that needs to be shared among all the methods.
These are the options I can see, which is the best?:
- Module with static ('module' in ruby) methods
- Class with static methods
- Mixin module for inclusion into the data structure
- Refactor out the part of the algorithm that modifies that data structure (very small) and make that a mixin that calls the static methods of the algorithm module
Technical part
Is there any way to make a private Module method?
module Thing
def self.pub; puts "Public method"; end
private
def self.priv; puts "Private method"; end
end
The private
in there doesn't seem to have any effect, I can still call Thing.priv
without issue.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
我认为最好的方法(主要是现有库的编写方式)是在模块内创建一个处理所有逻辑的类,并且该模块只是提供了一种方便的方法,例如
I think the best way (and mostly how existing libs are written) to do this is by creating a class within the module that deals with all the logic, and the module just provides a convenient method, e.g.
还有
Module.private_class_method
,它可以说表达了更多意图。对于问题中的代码:
Ruby 2.1 或更高版本:
There's also
Module.private_class_method
, which arguably expresses more intent.For the code in the question:
Ruby 2.1 or newer:
将方法作为 lambda 存储在类变量/常量中怎么样?
用于测试:
UPD:6年后此代码的巨大更新显示了声明私有方法的更清晰的方式
d
在这里我们看到:
1)
@@L
可以不能从外部访问,但几乎可以从任何地方访问2)
类 << 自己 ; 私人的 ; def
成功地使方法d
无法通过self.
从外部和内部访问,但如果没有它,则无法访问 - 这很奇怪3)
私有; self.
和private ; 类<< self
不要将方法设为私有——无论有没有self.
都可以访问它们。What's about storing methods as lambdas within class variables/constants?
For test:
UPD: huge update of this code after 6 years shows cleaner way to declare private method
d
Here we see that:
1)
@@L
can not be accesses from outside but is accessible from almost everywhere2)
class << self ; private ; def
successfully makes the methodd
inaccessible from outside and from inside withself.
but not without it -- this is weird3)
private ; self.
andprivate ; class << self
do not make methods private -- they are accessible both with and withoutself.
创建私有模块或类
常量永远不是私有的。 但是,可以创建模块或类而不将其分配给常量。
因此
:private_class_method
的替代方法是创建一个私有模块或类并在其上定义公共方法。用法:
请参阅 Module.new 和 Class.new。
Make a private module or class
Constants are never private. However, it's possible to create a module or class without assigning it to a constant.
So an alternative to
:private_class_method
is to create a private module or class and define public methods on it.Usage:
See the docs for Module.new and Class.new.
是如何在单个模块中嵌套多个类的解决方案,并且能够通过使用
extend
调用可从任何嵌套类访问的模块上的私有方法:以下 输出显示正在运行的解决方案:
Here's a solution for how you can have multiple classes nested within a single module, with the ability to call a private method on the module that's accessible from any of the nested classes, by making use of
extend
:Some output to show the solution in action:
当模块混合时,您可以使用“包含”方法来做一些奇特的事情。我认为这符合您的要求:
You can use the "included" method to do fancy things when a module is mixed in. This does about what you want I think:
不幸的是,
private
仅适用于实例方法。 在类中获取私有“静态”方法的一般方法是执行以下操作:诚然,我还没有在模块中这样做过。
Unfortunately,
private
only applies to instance methods. The general way to get private "static" methods in a class is to do something like:Admittedly I haven't played with doing this in modules.
除非您通过方法参数显式传递数据,否则此方法不允许与私有方法共享数据。
This method won't allow sharing data with the private methods unless you explicitly pass the data by method parameters.
一个好的方法是这样的
A nice way is like this