`
orcl_zhang
  • 浏览: 243265 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ruby里的方法作用域

    博客分类:
  • ruby
阅读更多
在java里private方法在Java当中的含义是只在当前类范围之内可以调用,当前类的子类也无法访问,但能被同一类别的其他对象实例调用.protected方法在Java当中的含义是在当前类所在的整个package当中都可见,其他package类则无法访问;

ruby里private,protected都可以被子类继承,但是都不能被实例调用.
protected可以被同类的(含子类)的其他对象中调用.
irb(main):001:0> class AccessTest
irb(main):002:1>   def test
irb(main):003:2>     "test private"
irb(main):004:2>   end
irb(main):005:1>   def test_other(other)
irb(main):006:2>     "other object" + other.test
irb(main):007:2>    end
irb(main):008:1> end
=> nil
irb(main):009:0> t1=AccessTest.new
=> #<AccessTest:0xb773e620>
irb(main):010:0> t2=AccessTest.new
=> #<AccessTest:0xb7737334>
irb(main):011:0> t1.test
=> "test private"
irb(main):012:0> t1.test_other(t2)
=> "other objecttest private"
irb(main):013:0> class AccessTest
irb(main):014:1>   private :test
irb(main):015:1> end
=> AccessTest
irb(main):016:0> t1.test
NoMethodError: private method `test' called for #<AccessTest:0xb773e620>
	from (irb):16
	from :0
#private 实例是调用不到的
irb(main):017:0> class AccessTest
irb(main):018:1>   def tt
irb(main):019:2>    'tt'
irb(main):020:2>   end
irb(main):021:1> protected :tt
irb(main):022:1> end
=> AccessTest
irb(main):023:0> t1.tt
NoMethodError: protected method `tt' called for #<AccessTest:0xb773e620>
	from (irb):23
	from :0
#protected 实例也调用不到(包括子类)
irb(main):024:0> class Sun < AccessTest
irb(main):025:1> end
=> nil
irb(main):026:0> s=Sun.new
=> #<Sun:0xb770f564>
irb(main):027:0> class Sun
irb(main):028:1>  def tt2
irb(main):029:2>   tt
irb(main):030:2>  end
irb(main):031:1> end
=> nil
irb(main):032:0> s.tt2
=> "tt"
irb(main):033:0> class Sun
irb(main):034:1>   def tt3
irb(main):035:2>     test
irb(main):036:2>   end
irb(main):037:1> end
=> nil
irb(main):038:0> s.tt3
=> "test private"
#protected可以被子类继承
irb(main):039:0> class AccessTest
irb(main):040:1> protected :test
irb(main):041:1> end
=> AccessTest
irb(main):042:0> s.test_other(s)
=> "other objecttest private"
#protected可以在同类(含子类)的其它对象的内部中使用
irb(main):043:0> s.test
NoMethodError: protected method `test' called for #<Sun:0xb770f564>
	from (irb):43
	from :0
irb(main):047:0> class Sun 
irb(main):048:1> public :test
irb(main):049:1> end
=> Sun
irb(main):050:0> s.test
=> "test private"
#可以单独改变子类的方法的作用域

分享到:
评论

相关推荐

    简要解读Ruby面向对象编程中的作用域

    从一个作用域进入另一个作用域的时候,局部变量会立即失效,为了让局部变量持续有效,可以通过规避关键字的方式,使用方法调用来代替作用域门,让一个作用域看到另一个作用域里的变量,从而达到目的。具体做法是

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

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

    Ruby - Ruby for Rails

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

    ruby官方chm文档

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

    Ruby In a Nutshell

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

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

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

    Ruby 编程语言的书籍

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

    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 语言基础(入门推荐)

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

    Ruby v2.6.3 正式版

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

    教程资源ruby

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

    .一步一步学RUBY

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

    Programming-Ruby-1.9源代码

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

    Ruby从入门到精通pdf

    - 闭包:块可以捕获其定义时的作用域内的变量,形成闭包,这使得Ruby的回调函数和函数式编程特性得以实现。 4. **模块**: - 模块用来组织代码,提供命名空间,也可以作为混入机制,实现代码复用。 - include...

    Mastering Ruby Closures

    当Proc对象被创建时,它会捕获周围作用域中的变量,使得即便在外部作用域发生变化后,Proc对象依然能够访问到这些变量。这意味着Proc对象是可重用的代码片段,它可以在不同的上下文中多次调用。 Lambda表达式与Proc...

    ruby 中文 教程 从入门到精通

    - **标识名和变量作用域**:Ruby中的变量根据作用域可分为局部变量、实例变量、类变量和全局变量。 - **数据类型**:Ruby支持多种内置的数据类型,如整型、浮点型、字符串、数组、哈希等。 - **赋值和条件运算符**:...

Global site tag (gtag.js) - Google Analytics