【发布时间】:2012-06-23 21:18:48
【问题描述】:
我一直有这个令人烦恼的反复出现的主题;比方说,我有一个类,它定义了一个实例方法和一个受保护的类方法。实例方法必须调用类方法。为了做到这一点,我不得不打破可见性规则并使用危险的“发送”功能。像这样的:
class Bang
def instance_bang
self.class.send(:class_band)
end
protected
def self.class_bang
puts "bang"
end
end
我觉得这很糟糕,因为类方法应该在类范围内使用,因此应该在其中保持可见和可调用,对吧?是否有另一种方法可以在实例方法中使用类方法,需要依赖“发送”函数,因此不会破坏可见性?
更新:
根据 Sergio Tulentsev 的回复(感谢纠正),我将使用代码 sn-p 更新我的担忧,该代码总结了我对仍在定义范围内时考虑方法可见性的担忧。
class Bang
def instance_bang
private_bang = 1
self.private_bang(private_bang)
end
private
def private_bang(p)
puts "bang"
p
end
end
调用 Bang.new.instance_bang 将引发异常,除非您在该 private_bang 调用上使用 send(这次我检查了它:)。
【问题讨论】:
-
这实际上是两个问题,可能应该分开。第一个是关于调用受保护的类方法,但您的代码示例无效,因为调用
protected仅影响实例方法(尝试 class -
@ChuckE 如果你
%s/class_band/class_bang/g,这似乎可以工作,至少对我来说是这样。
标签: ruby-on-rails ruby visibility