Sea*_*ren 6 ruby methods class protected instance
我一定不知道人们如何在Ruby中做到这一点.
如果'#protected'被取消注释,我们得到:
'what':受保护的方法'zoop'调用Foo:Class(NoMethodError)
有没有更好的方法来处理受保护的类方法?
class Foo
class << self
#protected
def zoop
"zoop"
end
end
public
def what
"it is '#{self.class.zoop}'"
end
protected
end
a = Foo.new
p a.what # => "it is 'zoop'"
Run Code Online (Sandbox Code Playgroud)
我想zoop受保护或私人(没有叫'Foo.zoop'),但到目前为止,我似乎无法找到一种优雅的方式.
在与 ruby-lang 中的 rue: 和 drbrain: 进行进一步讨论后,发现我通过将实用函数放置在类级别来节省内存的冲动是错误的。
在 Ruby 中,实例方法无论如何都挂在类之外,答案是继续将实用程序函数放置在实例级别作为私有。
总之,只能通过实例方法访问的实用函数:
class Foo
def what
"it is '#{zoop}'"
end
private
def zoop
"zoop"
end
end
p Foo.new.what # => "it is 'zoop'"
Run Code Online (Sandbox Code Playgroud)
对于需要从实例和类方法调用的实用函数,嵌套模块似乎是一种流行的方法:
class Foo
module Util
def self.zoop
"zoop"
end
end
def what
"it is '#{Util.zoop}'"
end
class << self
def class_what
"for all time it is '#{Util.zoop}'"
end
end
end
p Foo.new.what # => "it is 'zoop'"
p Foo.class_what # => "for all time it is 'zoop'"
p Foo::Util.zoop # visible, alas
Run Code Online (Sandbox Code Playgroud)