`
robbin
  • 浏览: 4797766 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
377a9ecd-1ea1-34ac-9530-9daa53bb2a7b
robbin谈管理
浏览量:135668
社区版块
存档分类
最新评论

ruby的方法调用作用域

    博客分类:
  • Ruby
阅读更多
ruby的method作用域和Java一样,修饰词都有private,protected和public。其中public的含义都是一样的,但是private和protected却完全不一样。这一点在《Programming ruby》当中语焉不详。今天看了《ruby for rails》第7章才搞明白了。

一、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

		继承		调用

public	      子类均可		均可
protected     子类均可		包内	
default	      包内子类		包内		
private	      均不可		类定义本身	


ruby

		继承		调用

public	      子类均可		均可
protected     子类均可		子类均可	
private	      子类均可		self	


5 楼 xvridan 2007-05-11  
呵呵,打错了,
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>
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>
2 楼 JGambler 2007-05-10  
“protected方法在Java当中的含义是在当前类所在的整个package当中都可见,其他package类则无法访问;”
   Boss,说错了吧,缺省情况下是包访问性,对protected保护成员来说,即使子类位于不同的package中,该子类也能够通过继承访问它啊~
1 楼 nanhuan5525 2007-05-04  
>Java当中,不管private还是protected的方法,
>都可以被同一个类别的其他对象实例调用;
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方法是因为在同一类作用域里,而不是因为"可以被同一个类别的其他对象实例调用"吧,请指教.

相关推荐

    Ruby中的Proc类及Proc的类方法Proc.new的使用解析

    在下例中,正因为Proc一直保持着局部变量的作用域,所以才能调用var变量。 var = 1 $foo = Proc.new { var } var = 2 def foo $foo.call end p foo # =&gt; 2 从生成Proc的方法中返回以后,若Proc中出现return或...

    ar_union:允许链接联合作用域的 AR 关系补丁

    联盟修补 ActiveRecord::Relation 允许联合作用域和有序联合作用域。 如果您有一个分片数据库,请注意跨分片查询的使用。安装将此行添加到应用程序的 Gemfile 中: gem 'ar_union' 然后执行: $ bundle或者自己安装...

    Ruby中proc和lambda的两个区别

     p = Proc.new{return 10} #调用这个块的时候,从p的作用域直接返回10,因此下面的return将不会执行  result = p.call  return result * 2 end   def two_method  p = lambda{return 10} #调用这个块的时候,从

    named-scopes-in-rails-using-lambda:使用 lambda 在 rails 中命名范围

    使用 lambda 在 Rails 中命名作用域 在 Rails 4 中命名范围需要使用 ruby lambda语法; 它们使您可以非常轻松地自定义复杂的查询。 查询可以在模式中定义,然后可以像ActiveRelation方法一样调用,另一方面,您也...

    Scala程序设计(第2版)

    13.6 作用域内私有和作用域内受保护可见性 306 13.7 对可见性的想法 312 13.8 本章回顾与下一章提要 313 第14章 Scala类型系统(I) 314 14.1 参数化类型 315 14.1.1 变异标记 315 14.1.2 类型...

    SuperCollider-3.11.0-macOS-signed.zip 亲测可用:用于音频合成和算法合成的平台

    sclang单一继承面向对象和函数式语言类似于Smalltalk或Ruby,语法类似于C或Javascript动态类型恒定时间消息查找和实时垃圾收集用作一流对象闭包是词法,作用域是词法和动态协程列表理解局部应用(显式计算)尾调用...

    JavaScript权威指南(第6版)(附源码)

    3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 ...

    Grails 技术精解与Web开发实践【源码+样章】----下载不扣分,回帖加1分,欢迎下载,童叟无欺

    与作用域 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 什么...

    JavaScript权威指南(第六版) 清晰-完整

    3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 ...

    JavaScript权威指南(第6版)(中文版)

    3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 ...

    JavaScript权威指南(第6版)

    3.10 变量作用域 第4章 表达式和运算符 4.1 原始表达式 4.2 对象和数组的初始化表达式 4.3 函数定义表达式 4.4 属性访问表达式 4.5 调用表达式 4.6 对象创建表达式 4.7 运算符概述 4.8 算术表达式 4.9 关系表达式 ...

    偏执狂:Rails 3、4和5的acts_as_paranoid

    偏执狂通过destroy记录时将当前时间设置为deleted_at来做到这一点,并通过对模型上所有查询的作用域进行隐藏以仅包括不包含deleted_at字段的记录来将其deleted_at 。 如果您希望实际销毁某个对象,则可以调用...

    pattern:轻量,标准化,面向轨道的模式的集合

    同样,每当要使用一系列作用域时,也应该考虑使用查询对象。 在可以找到有关使用查询对象的更多信息。 假设和规则 查询对象始终通过调用类级别的.call方法来使用 查询对象需要ActiveRecord::Relation或ActiveRecord...

    JavaScript权威指南(第6版)

    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 ...

    JavaScript权威指南(第6版)中文文字版

    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 ...

    Linux C程序设计大全

    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 编写多文件...

    javaSE代码实例

    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 擅用系统已有类的...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    第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的...

Global site tag (gtag.js) - Google Analytics