From:
http://weblog.jamisbuck.org/2007/2/23/method-visibility-in-ruby
A common point of confusion to even experienced Ruby programmers is the visibility of public, protected, and private methods in Ruby classes. This largely stems from the fact that the behavior of those keywords in Ruby is different from what you might have learned from Java and C.
To demonstrate these differences, let’s set up a little script:
class Foo
def a; end
# call 'a' with explicit 'self' as receiver
def b; self.a; end
# call 'a' with implicit 'self' as receiver
def c; a; end
end
def safe_send(receiver, method, message)
# can't use 'send' because it bypasses visibility rules
eval "receiver.#{method}"
rescue => e
puts "#{message}: #{e}"
else
puts "#{message}: succeeded"
end
visibility = ARGV.shift || "public"
Foo.send(visibility, :a)
foo = Foo.new
safe_send(foo, :a, "explicit receiver ")
safe_send(foo, :b, "explicit 'self' receiver")
safe_send(foo, :c, "implicit 'self' receiver")
Basically, the script just creates a class “Foo” with three methods: a, which we’ll invoke directly with an explicit, non-self receiver; b, which invokes a with self as receiver, and c, which invokes a with an implicit receiver of self. We’ll use the safe_send method to call each of those methods and log the result.
So, first: the public keyword. In Ruby, public means that the method may be invoked just about any way you please; in technical terms, the receiver of the message may be either explicit (“foo.bar”), self (“self.bar”) or implicit (“bar”).
引用
$ ruby demo.rb public
explicit receiver : succeeded
explicit 'self' receiver: succeeded
implicit 'self' receiver: succeeded
The protected keyword puts a straitjacket around the method. Any method declared protected may only be called if the receiver is self, explicitly or implicitly. (Update: protected methods may actually be called any time the receiver is of the same class as ‘self’...and an explicit self as receiver is just a specific case of that. Modifying the script to demonstrate this condition is left as an exercise for the reader.)
引用
$ ruby demo.rb protected
explicit receiver : protected method `a' called for #<Foo:0x3fc18>
explicit 'self' receiver: succeeded
implicit 'self' receiver: succeeded
Lastly, the private keyword is the tightest setting of all. A private method cannot be called with an explicit receiver at all, even if that receiver is “self”.
引用
$ ruby demo.rb private
explicit receiver : private method `a' called for #<Foo:0x3fc18>
explicit 'self' receiver: private method `a' called for #<Foo:0x3fc18>
implicit 'self' receiver: succeeded
Note that, unlike languages such as Java, inheritance plays absolutely no part in determining method visibility in Ruby. Subclasses can access both protected and private methods of the superclass without trouble, so long as they abide by the rules laid out above.
The difference between protected and private is very subtle, as you can see, which explains why protected is rarely used by most Rubyists. If it is used at all, it is generally as a convention, to document methods that are internal to the class, but which lie closer to the public interface than others. In Rails, for instance, you might declare your controller filter methods and model validation methods as “protected” (because the framework will call those methods) and reserve the “private” designation for those methods that are only ever called from within your own model or controller code.
分享到:
相关推荐
2.2 Computing Visibility of a Point in Simple Polygons 16 2.2.1 Non-Winding Polygon: O(n) Algorithm 16 2.2.2 Removing Winding: O(n) Algorithm 23 2.3 Computing Visibility of a Point in Polygons with ...
Modeling Mutual Visibility Relationship in Pedestrian Detection Modeling Mutual Visibility Relationship in Pedestrian Detection Modeling Mutual Visibility Relationship in Pedestrian Detection
该方法为在有雾天气下去雾的一种方法,有很高的参考价值
Managing visibility in Flutter – Flutter – Medium
`BoolToVisibilityConverter` 是一个内置的数据转换器,它用于将布尔值(`bool`)转换为 `Visibility`枚举类型,这对于根据逻辑状态控制UI元素的可见性非常有用。在本教程中,我们将深入探讨如何使用`...
VISIBILITY属性详解 在 Android 开发中,控件的可见性是非常重要的,VISIBILITY 属性就是控制控件的显示和隐藏的。通过设置 VISIBILITY 属性,我们可以控制控件的可见性,达到不同的显示效果。 VISIBLE、INVISIBLE...
地形渲染加速,可视剔除算法。适用VR、游戏研发等领域
在Android开发中,`visibility`属性是控制UI组件可见性的重要元素,广泛应用于各种视图控件,如TextView、ImageView、Button等。该属性决定了一个控件是否在屏幕上显示,以及如何显示。`visibility`属性有三个可能的...
return (value is Visibility visibility) && visibility == Visibility.Visible; } } ``` 接下来,你需要在你的XAML资源字典中声明这个转换器: ```xml ``` 这里的`local`是命名空间前缀,需要根据实际...
IEEE Transactions On Instrument and Measurement
《前端项目中的Page Visibility API与visibility.js库》 在当今的Web开发中,前端性能优化是不可或缺的一部分。其中,理解用户与页面的交互状态对于提升用户体验至关重要。这就是Page Visibility API和`visibility....
display与visibility的区别
在工业控制系统(ICS)环境中,确保网络安全至关重要,尤其是在面临分布式拒绝服务(DDoS)攻击时。本文将深入探讨如何在ICS环境下提升终端日志的可见性,以更好地防范潜在的安全威胁,符合法律法规的要求。...
JS 中 style.display 和 style.visibility 的区别实例说明 在 JavaScript 中,style.display 和 style.visibility 是两种常用的控制元素显隐的方法,但是它们之间有着根本的区别。 style.display style.display ...
A novel polarimetric dehazing method is proposed based on three linear polarization images (0°, 45°, and 90°). The polarization orientation angle of the light scattered by the haze particles is ...
在线社交网络中的社交可见性服务定价模型与算法_Pricing Social Visibility Service in Online Social Networks Modeling and Algorithms.pdf
本教程将详细讲解如何利用CSS3的`backface-visibility`属性来创建3D翻转动画效果。这个属性是实现高级动画和过渡效果的关键,特别是在构建响应式和动态用户界面时。 `backface-visibility`属性主要用于控制元素在3D...
在网页设计和开发中,`display` 和 `visibility` 是两个非常重要的CSS属性,它们用于控制元素在页面上的可见性和布局。这篇博客文章通过代码示例深入探讨了这两个属性的区别和用法。 首先,`display` 属性主要用于...
CSS隐藏元素 display visibility opacity的区别 display:none和visibility:hidden的区别 对比总结: height:0和overflow:hidden的组合