我有一个两部分的问题
最佳实践
这些是我能看到的选项,哪一个是最好的?:
带有静态(ruby中的‘
的静态方法的混合
技术部分
有没有办法让私有模块方法成为
module Thing
def self.pub; puts "Public method"; end
private
def self.priv; puts "Private method"; end
end
private
in 似乎没有任何效果,我仍然可以毫无问题地调用Thing.priv
。
发布于 2009-01-08 15:11:19
我认为最好的方法(主要是如何编写现有的库)是通过在模块中创建一个处理所有逻辑的类,该模块只提供了一个方便的方法,例如
module GTranslate
class Translator
def perform(text)
translate(text)
end
private
def translate(text)
# do some private stuff here
end
end
def self.translate(text)
t = Translator.new
t.perform(text)
end
end
发布于 2009-01-06 21:48:52
还有Module.private_class_method
,可以说它表达了更多的意图。
module Foo
def self.included(base)
base.instance_eval do
def method_name
# ...
end
private_class_method :method_name
end
end
end
对于问题中的代码:
module Thing
def self.pub; puts "Public method"; end
def self.priv; puts "Private method"; end
private_class_method :priv
end
Ruby 2.1或更高版本:
module Thing
def self.pub; puts "Public method"; end
private_class_method def self.priv; puts "Private method"; end
end
发布于 2016-01-26 19:15:33
module Writer
class << self
def output(s)
puts upcase(s)
end
private
def upcase(s)
s.upcase
end
end
end
Writer.output "Hello World"
# -> HELLO WORLD
Writer.upcase "Hello World"
# -> so.rb:16:in `<main>': private method `upcase' called for Writer:Module (NoMethodError)
https://stackoverflow.com/questions/318850
复制相似问题