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

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 - Ruby for Rails

    - **作用域规则**:深入理解 Ruby 中的作用域规则,包括局部作用域、类作用域等。 - **块与闭包**:介绍块的概念及其与闭包的区别,以及如何在 Ruby 中使用它们。 #### 2.5 控制流技术 - **条件语句**:讲解 if、...

    Ruby-Functo是ruby中的可组合方法对象

    闭包可以捕获其定义时的上下文,使得它们在稍后的时间点依然能够访问到那些变量,即使它们的生命周期已经超出原始的作用域。 Functo库的关键特性包括: 1. **可组合性**:通过Functo,你可以将多个小的函数组合成...

    Ruby In a Nutshell

    - 闭包是指能够访问其定义时作用域的变量的块,即使在块被调用时该作用域已不存在。 8. ** Proc和Lambda** - `Proc`和`lambda`都是Ruby的代码对象,可以存储和传递代码。 - `Proc`更灵活,允许在块末尾隐式返回...

    ruby语言帮助文档(简体中文)

    块可以与方法一起使用,形成闭包,这样就可以在方法中捕获并操作外部作用域的变量。 6. **元编程**:Ruby的元编程能力非常强大,允许在运行时修改和创建类和对象。这得益于Ruby的反射API和`send`方法,可以动态地...

    ruby官方chm文档

    《ruby23-language.chm》文档深入讲解了Ruby语言的特性,如动态性、元编程、闭包和块、方法定义与调用、变量作用域等。Ruby允许在运行时修改代码,这使得元编程成为其强大之处。理解如何使用`eval`、`class_eval`和`...

    Ruby 基础语法 视频教程1

    - **全局变量**(Global Variables):以`$`开头,其作用域在整个程序中,如`$debug = true`。 - **常量**(Constants):以大写字母开头,表示不变的值,如`PI = 3.14`,但实际并非完全不可变。 2. 变量规则...

    ruby-debug-1.87.rar

    在实际使用中,`ruby-debug`提供了丰富的命令集,如`step`(单步执行)、`next`(跳过当前行,如果当前行包含方法调用则进入该方法)、`finish`(执行到当前作用域结束)、`break`(设置断点)等。这些命令使我们...

    ruby trap 初学者使用

    理解它们的作用域和用法是避免陷阱的关键。 - 常量在Ruby中是可变的,但改变常量值会引发警告,初学者应避免随意修改。 2. **符号(Symbol)**: - 符号是Ruby中的一种特殊数据类型,它们是不可变的,常用于哈希...

    Ruby 编程语言的书籍

    1. **Ruby内部机制揭秘**:每章末尾都包含“Digging Deeper”部分,揭示Ruby运行时的各种细节,如作用域解析、多线程实现等,帮助读者更好地理解语言本身的设计理念。 2. **陷阱与注意事项**:通过实际案例分析常见...

    教程资源ruby

    - **全局变量**、**实例变量**和**局部变量**:不同作用域内的变量类型。 - **类常量**:属于类的常量。 - **异常处理**:通过 `rescue` 和 `ensure` 处理程序错误和清理操作。 - **存取器**:getter 和 setter 方法...

    Ruby 语言基础(入门推荐)

    闭包是能够访问其定义时作用域的变量的函数,即使该作用域在函数调用时已不再存在。 4. **元编程**:Ruby提供了强大的元编程能力,允许在运行时修改或创建类和方法,这极大地增强了代码的灵活性。 5. **模块**:...

    Ruby v2.6.3 正式版

    4. **闭包**:Ruby的Proc和Lambda实现了闭包的概念,它们能记住定义时的作用域,即使在其他作用域中调用也能访问这些变量。 5. **模块(Module)**:Ruby的模块用于封装相关的类和方法,实现代码复用和命名空间管理...

    Mastering Ruby Closures

    块(Blocks)是Ruby中一种简洁的代码块结构,通常被用在方法调用中以提供额外的指令。块不是对象,它们不能被赋值给变量或者作为参数传递给方法,但可以使用特定的关键字如yield来执行块中的代码。块的使用让Ruby的...

    .一步一步学RUBY

    变量分为局部变量、全局变量、实例变量和类变量,每种变量的作用域和生命周期不同,提供了灵活的数据封装和访问控制。 **常量**以大写字母开头,尽管Ruby允许对常量进行重新赋值,但这将触发警告,强调常量应保持...

    Programming-Ruby-1.9源代码

    - 变量:Ruby支持局部变量、实例变量、类变量和全局变量,源代码中会展示它们的用法和作用域。 - 数据类型:包括字符串、数字、布尔值、数组、哈希等,通过代码你可以看到它们的操作和转换方式。 - 控制结构:如...

    ruby中文教程(源代码)

    它们各自有不同的命名规则和作用域。 - 数据类型:Ruby是动态类型语言,主要数据类型包括字符串(`String`)、整数(`Integer`)、浮点数(`Float`)、布尔值(`TrueClass`和`FalseClass`)、数组(`Array`)、哈希...

    ruby语言入门教程(中文版)[PDF]

    Ruby还支持闭包,这是通过块、Proc和Lambda实现的,使得函数能够记住其定义时的作用域。 Ruby的标准库非常强大,包含了大量实用的模块,如文件操作、网络通信、正则表达式、日期和时间处理等。Ruby还有强大的元编程...

    ruby 1.8.5 .tgz

    块可以转换为闭包,保持对外部作用域的引用,这对于迭代和回调函数非常有用。 4. **元编程**:Ruby 提供了强大的元编程能力,使得程序员可以在运行时动态地创建和修改代码,这极大地扩展了其表达能力。 5. **语法...

    ruby语法

    10. **闭包(Lambda)与Proc**: Ruby中的闭包和Proc对象都代表了一段可调用的代码,它们可以捕获并存储其定义时的作用域。 11. **元编程**: Ruby允许在运行时修改类和对象,这是通过元编程实现的。例如,可以动态...

Global site tag (gtag.js) - Google Analytics