- 浏览: 4826007 次
- 性别:
- 来自: 上海
博客专栏
-
robbin谈管理
浏览量:137471
文章分类
最新评论
-
xly1981:
领导者是团队的灵魂。深入一线的过程,包括代码review,能帮 ...
robbin谈管理:改造团队的经验(2) -
jiehuangwei:
像这种总结比较性的ppt文档可以多发啊
Web并发模型粗浅探讨 -
linux1308:
看完学习到了很多东西,感谢推荐!
推荐一篇很好的RoR部署方案性能评测 -
zweite:
直接对搜索的结果进行缓存是不是会更快一点呢
漫谈应用缓存的命中率问题 -
kaogua:
现在已经是ruby2.0了, 不知道这个的效率是怎么样的, 是 ...
Ruby作为服务器端应用已经成熟了
ruby的method作用域和Java一样,修饰词都有private,protected和public。其中public的含义都是一样的,但是private和protected却完全不一样。这一点在《Programming ruby》当中语焉不详。今天看了《ruby for rails》第7章才搞明白了。
一、Java当中的含义:
private方法在Java当中的含义是只在当前类范围之内可以调用,当前类的子类也无法访问,但能被同一类别的其他对象实例调用,例如:
protected方法在Java当中的含义是在当前类所在的整个package当中都可见,其他package类则无法访问;
二、Ruby当中的含义:
private在当前类以及子类都可以调用,其他类无法访问,比Java宽松一些,但private方法只能被当前对象隐式调用(self.),不能被同一类别的其他对象实例调用,这又比Java严格;
protected稍微宽松一些,可以被同一个类别的其他实例调用,例如:
在类别C当中使用c.name,如果name方法是private的话,只能使用self调用,即只能当前对象实例在当前类范围内调用;如果name方法是protected的话,那么可以使用同一类的对象实例显式调用,即可以引用其他对象实例的name方法。
因此private和protected的在ruby当前和Java的定义有很大的区别:
1、在不同对象实例当中的作用域不同
Java当中,不管private还是protected的方法,都可以被同一个类别的其他对象实例调用;
Ruby当中,private方法不能被同一个类别的其他对象实例调用;
2、在类继承关系当中的作用域不同
ruby当中,不管private还是protected方法,都可以被子类继承;
Java当中,private方法不能被子类继承;
这种方法调用的差异,也许来自于不同的面向对象理念:Java的面向对象来自C++,强调类继承关系,所以方法调用限定类继承的层次结构当中的作用域,却不强调对象实例作用域;而ruby的面向对象来自smalltalk,即使是类别也是对象,因此方法调用作用域都是针对对象实例调用来设置的。
一、Java当中的含义:
private方法在Java当中的含义是只在当前类范围之内可以调用,当前类的子类也无法访问,但能被同一类别的其他对象实例调用,例如:
package com.javaeye; public class C { private String name; private String getName() { return name; } public C(String name) { this.name = name; } public boolean compare(C c) { return this.name == c.getName(); } }
protected方法在Java当中的含义是在当前类所在的整个package当中都可见,其他package类则无法访问;
二、Ruby当中的含义:
private在当前类以及子类都可以调用,其他类无法访问,比Java宽松一些,但private方法只能被当前对象隐式调用(self.),不能被同一类别的其他对象实例调用,这又比Java严格;
protected稍微宽松一些,可以被同一个类别的其他实例调用,例如:
class C def initialize(name) @name = name end def compare(c) c.name == @name end protected def name @name end end class D < C end d1 = D.new("fankai") d2 = D.new("hello") puts d1.compare(d2)
在类别C当中使用c.name,如果name方法是private的话,只能使用self调用,即只能当前对象实例在当前类范围内调用;如果name方法是protected的话,那么可以使用同一类的对象实例显式调用,即可以引用其他对象实例的name方法。
因此private和protected的在ruby当前和Java的定义有很大的区别:
1、在不同对象实例当中的作用域不同
Java当中,不管private还是protected的方法,都可以被同一个类别的其他对象实例调用;
Ruby当中,private方法不能被同一个类别的其他对象实例调用;
2、在类继承关系当中的作用域不同
ruby当中,不管private还是protected方法,都可以被子类继承;
Java当中,private方法不能被子类继承;
这种方法调用的差异,也许来自于不同的面向对象理念:Java的面向对象来自C++,强调类继承关系,所以方法调用限定类继承的层次结构当中的作用域,却不强调对象实例作用域;而ruby的面向对象来自smalltalk,即使是类别也是对象,因此方法调用作用域都是针对对象实例调用来设置的。
评论
6 楼
dogstar
2007-06-12
java
ruby
继承 调用 public 子类均可 均可 protected 子类均可 包内 default 包内子类 包内 private 均不可 类定义本身
ruby
继承 调用 public 子类均可 均可 protected 子类均可 子类均可 private 子类均可 self
5 楼
xvridan
2007-05-11
呵呵,打错了,
D类的对象不能访问D类的private方法,对象也不能访问其蓝图类的私有属性的方法和变量
D类的对象不能访问D类的private方法,对象也不能访问其蓝图类的私有属性的方法和变量
4 楼
someone
2007-05-11
<br/>
<strong>xvridan 写道:</strong><br/>
<div class='quote_div'>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
<ol class='dp-j'>
<li class='alt'><span><span class='keyword'>package</span><span> test; </span></span> </li>
<li class=''><span> </span> </li>
<li class='alt'><span><span class='keyword'>public</span><span> </span><span class='keyword'>class</span><span> C { </span></span> </li>
<li class=''><span> </span> </li>
<li class='alt'><span> <span class='keyword'>public</span><span> </span><span class='keyword'>void</span><span> test(){ </span></span> </li>
<li class=''><span> D d = <span class='keyword'>new</span><span> D(); </span></span> </li>
<li class='alt'><span> d.getA(); </span> </li>
<li class=''><span> } </span> </li>
<li class='alt'><span>} </span> </li>
<li class=''><span><span class='keyword'>class</span><span> D{ </span></span> </li>
<li class='alt'><span> </span> </li>
<li class=''><span> <span class='keyword'>private</span><span> </span><span class='keyword'>int</span><span> a=</span><span class='number'>0</span><span>; </span></span> </li>
<li class='alt'><span> <span class='keyword'>private</span><span> </span><span class='keyword'>int</span><span> getA(){ </span></span> </li>
<li class=''><span> <span class='keyword'>return</span><span> a; </span></span> </li>
<li class='alt'><span> } </span> </li>
<li class=''><span>} </span> </li>
</ol>
这段代码是不能通过编译的,D类的对象不对访问D类的private方法,java中"<span class='postbody'>Java当中,不管private还是protected的方法,都可以被同一个类别的其他对象实例调用; </span>"这个说法是不妥当的。</div>
</div>
<p><br/>
<br/>
什么叫“D类的对象不对访问D类的private方法”?</p>
<p>d.getA(); 就是D类的对象访问D类的“getA”方法?</p>
<p>不理解不要瞎说啊。<br/>
<br/>
</p>
<strong>xvridan 写道:</strong><br/>
<div class='quote_div'>
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
<ol class='dp-j'>
<li class='alt'><span><span class='keyword'>package</span><span> test; </span></span> </li>
<li class=''><span> </span> </li>
<li class='alt'><span><span class='keyword'>public</span><span> </span><span class='keyword'>class</span><span> C { </span></span> </li>
<li class=''><span> </span> </li>
<li class='alt'><span> <span class='keyword'>public</span><span> </span><span class='keyword'>void</span><span> test(){ </span></span> </li>
<li class=''><span> D d = <span class='keyword'>new</span><span> D(); </span></span> </li>
<li class='alt'><span> d.getA(); </span> </li>
<li class=''><span> } </span> </li>
<li class='alt'><span>} </span> </li>
<li class=''><span><span class='keyword'>class</span><span> D{ </span></span> </li>
<li class='alt'><span> </span> </li>
<li class=''><span> <span class='keyword'>private</span><span> </span><span class='keyword'>int</span><span> a=</span><span class='number'>0</span><span>; </span></span> </li>
<li class='alt'><span> <span class='keyword'>private</span><span> </span><span class='keyword'>int</span><span> getA(){ </span></span> </li>
<li class=''><span> <span class='keyword'>return</span><span> a; </span></span> </li>
<li class='alt'><span> } </span> </li>
<li class=''><span>} </span> </li>
</ol>
这段代码是不能通过编译的,D类的对象不对访问D类的private方法,java中"<span class='postbody'>Java当中,不管private还是protected的方法,都可以被同一个类别的其他对象实例调用; </span>"这个说法是不妥当的。</div>
</div>
<p><br/>
<br/>
什么叫“D类的对象不对访问D类的private方法”?</p>
<p>d.getA(); 就是D类的对象访问D类的“getA”方法?</p>
<p>不理解不要瞎说啊。<br/>
<br/>
</p>
3 楼
xvridan
2007-05-11
<div class='code_title'>java 代码</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
<ol class='dp-j' start='1'>
<li class='alt'><span><span class='keyword'>package</span><span> test; </span></span></li>
<li class=''><span> </span></li>
<li class='alt'><span><span class='keyword'>public</span><span> </span><span class='keyword'>class</span><span> C { </span></span></li>
<li class=''><span> </span></li>
<li class='alt'><span> <span class='keyword'>public</span><span> </span><span class='keyword'>void</span><span> test(){ </span></span></li>
<li class=''><span> D d = <span class='keyword'>new</span><span> D(); </span></span></li>
<li class='alt'><span> d.getA(); </span></li>
<li class=''><span> } </span></li>
<li class='alt'><span>} </span></li>
<li class=''><span><span class='keyword'>class</span><span> D{ </span></span></li>
<li class='alt'><span> </span></li>
<li class=''><span> <span class='keyword'>private</span><span> </span><span class='keyword'>int</span><span> a=</span><span class='number'>0</span><span>; </span></span></li>
<li class='alt'><span> <span class='keyword'>private</span><span> </span><span class='keyword'>int</span><span> getA(){ </span></span></li>
<li class=''><span> <span class='keyword'>return</span><span> a; </span></span></li>
<li class='alt'><span> } </span></li>
<li class=''><span>} </span></li>
</ol>
这段代码是不能通过编译的,D类的对象不对访问D类的private方法,java中"<span class='postbody'>Java当中,不管private还是protected的方法,都可以被同一个类别的其他对象实例调用; </span>"这个说法是不妥当的。</div>
<div class='dp-highlighter'>
<div class='bar'> </div>
<ol class='dp-j' start='1'>
<li class='alt'><span><span class='keyword'>package</span><span> test; </span></span></li>
<li class=''><span> </span></li>
<li class='alt'><span><span class='keyword'>public</span><span> </span><span class='keyword'>class</span><span> C { </span></span></li>
<li class=''><span> </span></li>
<li class='alt'><span> <span class='keyword'>public</span><span> </span><span class='keyword'>void</span><span> test(){ </span></span></li>
<li class=''><span> D d = <span class='keyword'>new</span><span> D(); </span></span></li>
<li class='alt'><span> d.getA(); </span></li>
<li class=''><span> } </span></li>
<li class='alt'><span>} </span></li>
<li class=''><span><span class='keyword'>class</span><span> D{ </span></span></li>
<li class='alt'><span> </span></li>
<li class=''><span> <span class='keyword'>private</span><span> </span><span class='keyword'>int</span><span> a=</span><span class='number'>0</span><span>; </span></span></li>
<li class='alt'><span> <span class='keyword'>private</span><span> </span><span class='keyword'>int</span><span> getA(){ </span></span></li>
<li class=''><span> <span class='keyword'>return</span><span> a; </span></span></li>
<li class='alt'><span> } </span></li>
<li class=''><span>} </span></li>
</ol>
这段代码是不能通过编译的,D类的对象不对访问D类的private方法,java中"<span class='postbody'>Java当中,不管private还是protected的方法,都可以被同一个类别的其他对象实例调用; </span>"这个说法是不妥当的。</div>
2 楼
JGambler
2007-05-10
“protected方法在Java当中的含义是在当前类所在的整个package当中都可见,其他package类则无法访问;”
Boss,说错了吧,缺省情况下是包访问性,对protected保护成员来说,即使子类位于不同的package中,该子类也能够通过继承访问它啊~
Boss,说错了吧,缺省情况下是包访问性,对protected保护成员来说,即使子类位于不同的package中,该子类也能够通过继承访问它啊~
1 楼
nanhuan5525
2007-05-04
>Java当中,不管private还是protected的方法,
>都可以被同一个类别的其他对象实例调用;
上面的compare方法可以调用private的getName方法是因为在同一类作用域里,而不是因为"可以被同一个类别的其他对象实例调用"吧,请指教.
>都可以被同一个类别的其他对象实例调用;
public class C { private String name; private String getName() { return name; } public C(String name) { this.name = name; } public boolean compare(C c) { return this.name == c.getName(); } }
上面的compare方法可以调用private的getName方法是因为在同一类作用域里,而不是因为"可以被同一个类别的其他对象实例调用"吧,请指教.
发表评论
-
《松本行弘的程序世界》推荐序
2011-07-21 13:47 15305在流行的编程语言中,ruby是一个比较另类的存在,这是因为大多 ... -
从Rails聊聊小公司的研发团队建设
2011-03-23 10:49 37234首先分享一点数据吧: JavaEye的PV到了140万了,一 ... -
Ruby作为服务器端应用已经成熟了
2009-11-17 14:55 15977JavaEye网站在过去的Ruby on rails实践当中, ... -
基于资源的HTTP Cache的实现介绍
2009-09-05 00:27 17076我们都知道浏览器会缓 ... -
请注意Rails2.3自带的memcache-client有性能问题
2009-03-23 18:05 14511Rails2.3版本发布了,这个版本内部的改动非常大,相关介绍 ... -
监视Rails进程内存泄漏的技巧
2008-12-30 21:56 10972Rails应用比较容易遇到的两类性能问题:一类是Rails执行 ... -
ruby MBARI大补丁性能评测报告
2008-12-23 12:19 5075JavaEye之前的新闻ruby内存泄漏的罪魁祸首 - 幽灵指 ... -
在top监视窗口显示Rails当前正在执行的请求URL
2008-12-01 14:15 9863这是一个从PragDave的博客上面学来的技巧,很实用,很co ... -
对Ruby VM的GC的思考
2008-09-02 23:41 8988Ruby虽然是动态脚本语言 ... -
推荐一篇很好的RoR部署方案性能评测
2008-07-08 11:55 9681今年年初的时候,我写了一篇RoR部署方案深度剖析的文章,分析了 ... -
Ruby和Rails的缺点
2008-06-25 21:08 17409有人说,robbin你说了那么多RoR的优点,你啥时候说说Ro ... -
Skynet --- ruby的类Google Map/Reduce框架
2008-06-02 00:39 8303Skynet是一个很响亮的名 ... -
rmmseg-cpp - 简洁高效的ruby中文分词程序
2008-05-27 00:47 11243我在前一篇文章向大家 ... -
使用libmmseg实现Ruby的中文分词功能
2008-05-24 21:43 11337用Ruby on Rails开发web2.0网站的人都知道,r ... -
mod_rails尝鲜
2008-04-13 14:32 8086Passenger(俗称mod_rails)是 ... -
Lighttpd和RoR安装配置的疑难解答
2008-03-07 11:09 14866之前写过一篇在Linux平 ... -
JavaEye网站的RoR性能优化经验谈
2008-01-20 16:11 18467JavaEye网站从2006年9月11 ... -
RoR部署方案深度剖析
2008-01-14 03:10 14809RoR的部署方案可谓五花八门,有Apache/Fastcgi方 ... -
RoR网站如何利用lighttpd的X-sendfile功能提升文件下载性能
2008-01-12 17:45 10268传统的Web服务器在处理文件下载的时候,总是先读入文件内容到应 ... -
Ruby为什么会受程序员的欢迎?
2008-01-07 20:08 15755孟岩最近写了一篇博客 ...
相关推荐
- **作用域规则**:深入理解 Ruby 中的作用域规则,包括局部作用域、类作用域等。 - **块与闭包**:介绍块的概念及其与闭包的区别,以及如何在 Ruby 中使用它们。 #### 2.5 控制流技术 - **条件语句**:讲解 if、...
闭包可以捕获其定义时的上下文,使得它们在稍后的时间点依然能够访问到那些变量,即使它们的生命周期已经超出原始的作用域。 Functo库的关键特性包括: 1. **可组合性**:通过Functo,你可以将多个小的函数组合成...
- 闭包是指能够访问其定义时作用域的变量的块,即使在块被调用时该作用域已不存在。 8. ** Proc和Lambda** - `Proc`和`lambda`都是Ruby的代码对象,可以存储和传递代码。 - `Proc`更灵活,允许在块末尾隐式返回...
块可以与方法一起使用,形成闭包,这样就可以在方法中捕获并操作外部作用域的变量。 6. **元编程**:Ruby的元编程能力非常强大,允许在运行时修改和创建类和对象。这得益于Ruby的反射API和`send`方法,可以动态地...
《ruby23-language.chm》文档深入讲解了Ruby语言的特性,如动态性、元编程、闭包和块、方法定义与调用、变量作用域等。Ruby允许在运行时修改代码,这使得元编程成为其强大之处。理解如何使用`eval`、`class_eval`和`...
- **全局变量**(Global Variables):以`$`开头,其作用域在整个程序中,如`$debug = true`。 - **常量**(Constants):以大写字母开头,表示不变的值,如`PI = 3.14`,但实际并非完全不可变。 2. 变量规则...
在实际使用中,`ruby-debug`提供了丰富的命令集,如`step`(单步执行)、`next`(跳过当前行,如果当前行包含方法调用则进入该方法)、`finish`(执行到当前作用域结束)、`break`(设置断点)等。这些命令使我们...
理解它们的作用域和用法是避免陷阱的关键。 - 常量在Ruby中是可变的,但改变常量值会引发警告,初学者应避免随意修改。 2. **符号(Symbol)**: - 符号是Ruby中的一种特殊数据类型,它们是不可变的,常用于哈希...
1. **Ruby内部机制揭秘**:每章末尾都包含“Digging Deeper”部分,揭示Ruby运行时的各种细节,如作用域解析、多线程实现等,帮助读者更好地理解语言本身的设计理念。 2. **陷阱与注意事项**:通过实际案例分析常见...
- **全局变量**、**实例变量**和**局部变量**:不同作用域内的变量类型。 - **类常量**:属于类的常量。 - **异常处理**:通过 `rescue` 和 `ensure` 处理程序错误和清理操作。 - **存取器**:getter 和 setter 方法...
闭包是能够访问其定义时作用域的变量的函数,即使该作用域在函数调用时已不再存在。 4. **元编程**:Ruby提供了强大的元编程能力,允许在运行时修改或创建类和方法,这极大地增强了代码的灵活性。 5. **模块**:...
4. **闭包**:Ruby的Proc和Lambda实现了闭包的概念,它们能记住定义时的作用域,即使在其他作用域中调用也能访问这些变量。 5. **模块(Module)**:Ruby的模块用于封装相关的类和方法,实现代码复用和命名空间管理...
块(Blocks)是Ruby中一种简洁的代码块结构,通常被用在方法调用中以提供额外的指令。块不是对象,它们不能被赋值给变量或者作为参数传递给方法,但可以使用特定的关键字如yield来执行块中的代码。块的使用让Ruby的...
变量分为局部变量、全局变量、实例变量和类变量,每种变量的作用域和生命周期不同,提供了灵活的数据封装和访问控制。 **常量**以大写字母开头,尽管Ruby允许对常量进行重新赋值,但这将触发警告,强调常量应保持...
- 变量:Ruby支持局部变量、实例变量、类变量和全局变量,源代码中会展示它们的用法和作用域。 - 数据类型:包括字符串、数字、布尔值、数组、哈希等,通过代码你可以看到它们的操作和转换方式。 - 控制结构:如...
它们各自有不同的命名规则和作用域。 - 数据类型:Ruby是动态类型语言,主要数据类型包括字符串(`String`)、整数(`Integer`)、浮点数(`Float`)、布尔值(`TrueClass`和`FalseClass`)、数组(`Array`)、哈希...
Ruby还支持闭包,这是通过块、Proc和Lambda实现的,使得函数能够记住其定义时的作用域。 Ruby的标准库非常强大,包含了大量实用的模块,如文件操作、网络通信、正则表达式、日期和时间处理等。Ruby还有强大的元编程...
块可以转换为闭包,保持对外部作用域的引用,这对于迭代和回调函数非常有用。 4. **元编程**:Ruby 提供了强大的元编程能力,使得程序员可以在运行时动态地创建和修改代码,这极大地扩展了其表达能力。 5. **语法...
10. **闭包(Lambda)与Proc**: Ruby中的闭包和Proc对象都代表了一段可调用的代码,它们可以捕获并存储其定义时的作用域。 11. **元编程**: Ruby允许在运行时修改类和对象,这是通过元编程实现的。例如,可以动态...