- 浏览: 4797766 次
- 性别:
- 来自: 上海
博客专栏
-
robbin谈管理
浏览量:135668
文章分类
最新评论
-
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 15055在流行的编程语言中,ruby是一个比较另类的存在,这是因为大多 ... -
从Rails聊聊小公司的研发团队建设
2011-03-23 10:49 37070首先分享一点数据吧: JavaEye的PV到了140万了,一 ... -
Ruby作为服务器端应用已经成熟了
2009-11-17 14:55 15759JavaEye网站在过去的Ruby on rails实践当中, ... -
基于资源的HTTP Cache的实现介绍
2009-09-05 00:27 16955我们都知道浏览器会缓 ... -
请注意Rails2.3自带的memcache-client有性能问题
2009-03-23 18:05 14272Rails2.3版本发布了,这个版本内部的改动非常大,相关介绍 ... -
监视Rails进程内存泄漏的技巧
2008-12-30 21:56 10850Rails应用比较容易遇到的两类性能问题:一类是Rails执行 ... -
ruby MBARI大补丁性能评测报告
2008-12-23 12:19 5008JavaEye之前的新闻ruby内存泄漏的罪魁祸首 - 幽灵指 ... -
在top监视窗口显示Rails当前正在执行的请求URL
2008-12-01 14:15 9774这是一个从PragDave的博客上面学来的技巧,很实用,很co ... -
对Ruby VM的GC的思考
2008-09-02 23:41 8881Ruby虽然是动态脚本语言 ... -
推荐一篇很好的RoR部署方案性能评测
2008-07-08 11:55 9486今年年初的时候,我写了一篇RoR部署方案深度剖析的文章,分析了 ... -
Ruby和Rails的缺点
2008-06-25 21:08 17287有人说,robbin你说了那么多RoR的优点,你啥时候说说Ro ... -
Skynet --- ruby的类Google Map/Reduce框架
2008-06-02 00:39 8233Skynet是一个很响亮的名 ... -
rmmseg-cpp - 简洁高效的ruby中文分词程序
2008-05-27 00:47 11149我在前一篇文章向大家 ... -
使用libmmseg实现Ruby的中文分词功能
2008-05-24 21:43 11232用Ruby on Rails开发web2.0网站的人都知道,r ... -
mod_rails尝鲜
2008-04-13 14:32 8030Passenger(俗称mod_rails)是 ... -
Lighttpd和RoR安装配置的疑难解答
2008-03-07 11:09 14727之前写过一篇在Linux平 ... -
JavaEye网站的RoR性能优化经验谈
2008-01-20 16:11 18320JavaEye网站从2006年9月11 ... -
RoR部署方案深度剖析
2008-01-14 03:10 14677RoR的部署方案可谓五花八门,有Apache/Fastcgi方 ... -
RoR网站如何利用lighttpd的X-sendfile功能提升文件下载性能
2008-01-12 17:45 10153传统的Web服务器在处理文件下载的时候,总是先读入文件内容到应 ... -
Ruby为什么会受程序员的欢迎?
2008-01-07 20:08 15690孟岩最近写了一篇博客 ...
相关推荐
在下例中,正因为Proc一直保持着局部变量的作用域,所以才能调用var变量。 var = 1 $foo = Proc.new { var } var = 2 def foo $foo.call end p foo # => 2 从生成Proc的方法中返回以后,若Proc中出现return或...
联盟修补 ActiveRecord::Relation 允许联合作用域和有序联合作用域。 如果您有一个分片数据库,请注意跨分片查询的使用。安装将此行添加到应用程序的 Gemfile 中: gem 'ar_union' 然后执行: $ bundle或者自己安装...
p = Proc.new{return 10} #调用这个块的时候,从p的作用域直接返回10,因此下面的return将不会执行 result = p.call return result * 2 end def two_method p = lambda{return 10} #调用这个块的时候,从
使用 lambda 在 Rails 中命名作用域 在 Rails 4 中命名范围需要使用 ruby lambda语法; 它们使您可以非常轻松地自定义复杂的查询。 查询可以在模式中定义,然后可以像ActiveRelation方法一样调用,另一方面,您也...
13.6 作用域内私有和作用域内受保护可见性 306 13.7 对可见性的想法 312 13.8 本章回顾与下一章提要 313 第14章 Scala类型系统(I) 314 14.1 参数化类型 315 14.1.1 变异标记 315 14.1.2 类型...
sclang单一继承面向对象和函数式语言类似于Smalltalk或Ruby,语法类似于C或Javascript动态类型恒定时间消息查找和实时垃圾收集用作一流对象闭包是词法,作用域是词法和动态协程列表理解局部应用(显式计算)尾调用...
3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 ...
与作用域 175 14.2 GSP标签库 175 14.2.1 常用的内置标签 176 14.2.2 开发自定义标签 179 14.3 Grails对Ajax的支持 182 14.4 本章小结 184 第15章 实现Web Service 185 15.1 REST风格的Web Service 185 15.1.1 什么...
3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 ...
3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 ...
3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 ...
偏执狂通过destroy记录时将当前时间设置为deleted_at来做到这一点,并通过对模型上所有查询的作用域进行隐藏以仅包括不包含deleted_at字段的记录来将其deleted_at 。 如果您希望实际销毁某个对象,则可以调用...
同样,每当要使用一系列作用域时,也应该考虑使用查询对象。 在可以找到有关使用查询对象的更多信息。 假设和规则 查询对象始终通过调用类级别的.call方法来使用 查询对象需要ActiveRecord::Relation或ActiveRecord...
3.10 变量作用域 56 第4章 表达式和运算符 60 4.1 原始表达式 60 4.2 对象和数组的初始化表达式 61 4.3 函数定义表达式 62 4.4 属性访问表达式 63 4.5 调用表达式 64 4.6 对象创建表达式 64 4.7 运算符概述 65 4.8 ...
3.10 变量作用域 56 第4章 表达式和运算符 60 4.1 原始表达式 60 4.2 对象和数组的初始化表达式 61 4.3 函数定义表达式 62 4.4 属性访问表达式 63 4.5 调用表达式 64 4.6 对象创建表达式 64 4.7 运算符概述 65 4.8 ...
3.2 变量的作用域和生命期 3.2.1 全局变量 3.2.2 局部变量 3.3 变量的初始值 3.3.1 全局变量的初始值 3.3.2 局部变量的初始值 3.4 与函数有关的优化 3.4.1 函数调用与程序优化 3.4.2 变量存储优化 3.5 编写多文件...
6.7.1 局部变量的作用域 89 6.7.2 局部变量的初始化 90 6.8 this预定义对象引用 92 6.9 擅用系统已有的类 94 6.9.1 Java中的Date类 94 6.9.2 Java中的GregorianCalendar类 96 6.9.3 擅用系统已有类的...
第5章 JNDI和远程方法调用 204 5.1 JNDI的概念 205 5.1.1 命名服务 205 5.1.2 目录服务 206 5.1.3 JNDI的优点 206 5.2 JNDI编程入门 207 5.2.1 文件系统的命名服务 207 5.2.2 JNDI编程 208 5.3 服务器提供的JNDI支持...
动态作用域及正则匹配效应... 295 匹配修改的特殊变量... 299 qr/…/运算符与regex对象... 303 构建和使用regex对象... 303 探究regex对象... 305 用regex对象提高效率... 306 Match运算符... 306 Match的...