`
orcl_zhang
  • 浏览: 234125 次
  • 性别: 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中的块的知识

    主要介绍了详解Ruby中的块的知识,包括yield语句和begin/end块等知识点,需要的朋友可以参考下

    详解Ruby中的单件方法和单件类

    单件方法顾名思义,就是只作用于单个对象的方法,同理单件类就是单件方法所存在的类,规定其作用域,这里我们就来详解Ruby中的单件方法和单件类:

    Ruby面向对象编程中类的方法与类的扩展

    类与方法是面向对象编程语言中的典型特性,方法的概念与函数基本上相同,只不过类方法会受到类作用域的约束,这里我们就简单来看一下Ruby面向对象编程中类的方法与类的扩展

    透视Ruby 1.9的Lambda函数

    Ruby的Block块是它的关键特色之一,用块能够写出简明且高度可重用的算法。即使没有别的用处,它至少消弱了...Lambda是个十分令人迷惑的词汇,因为闭包这个词汇还指对代码作用域的捕获。而块则不需要捕获这个作用域。

    Ruby中的return、break、next详解

    return,break,next 这几个关键字的使用都涉及到跳出作用域的问题,而他们的不同 则在于不同的关键字跳出去的目的作用域的不同,因为有代码块则导致有一些地方需要格外注意。 return 常用方式 通常情况下的return...

    has_scope:将传入的控制器参数映射到资源中的命名作用域

    HasScope 具有作用域允许您将传入的控制器参数映射到资源中的命名作用域。 想象一下以下模型,称为刻度: class Graduation &lt; ActiveRecord&gt; { where ( featured : true ) } scope :by_degree , -&gt; degree { where ...

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

    Proc是对块及其context(局部变量的作用域以及栈框架)进行对象化处理之后得到的过程对象。您可以像使用无名函数那样来使用Proc,但它不会导入局部变量的作用域(可以把动态局部变量用作Proc局部变量)。 在下例中,正...

    Ruby面向对象编程中类与方法的基础学习

    方法可以理解为类中的函数,一定程度上可以受到类作用域的制约,其他地方和传统意义上的函数无太大区别,这里我们就一起来进行Ruby面向对象编程中类与方法的基础学习

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

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

    Ruby语言入门教程

    3.5 标识名和变量的作用域..................................................................................................19 3.6 类库......................................................................

    atom-aligner-ruby:Ruby对Aligner的支持

    2021-03-12 v1.8.0更新=&gt;作用域使其正常工作 2018年6月24日V1.7.0新增支持, 2017-05-26 v1.6.1修复了= config标题中的拼写错误 2017-05-18 v1.6.0在Rspec中添加了对eq支持 2016-08-01 v1.5.0将前缀支持添加到=...

    Ruby的面向对象方式编程学习杂记

    Ruby的class关键字更像是一个作用域操作符,而不是类型声明语句。class关键字的核心任务是把你带到类的上下文中,让你可以在里面定义方法。 每个类都是一个模块,类就是带有三个方法(new,allocate,superclass)的...

    Ruby编程中关于中断和返回的用法教程

    return,break,next 这几个关键字的使用都涉及到跳出作用域的问题,而他们的不同 则在于不同的关键字跳出去的目的作用域的不同,因为有代码块则导致有一些地方需要格外注意。 return 常用方式 通常情况下的return...

    rails-scope:Rails 应用程序的作用域 gem

    rails-scope Ruby gem,它允许 nVisium 为评估目的准确自动地确定 Ruby on Rails 应用程序的范围。输出将包括代码复杂度路线控制器、视图和模型的数量控制器、视图和模型中的代码行以及正在使用的 RubyGems 的名称...

    polyphony:Ruby的细粒度并发

    用于控制并发代码执行的抽象和构造:主管,取消作用域,限制,资源池等。 代码可以使用本机网络类和库,从而增加了对pg和redis等第三方gem的支持。 使用stdlib类,例如TCPServer , TCPSocket和OpenSSL::SSL::SSL...

    slack-ruby-bot-server:一个库,使您可以在Ruby中编写具有Slack按钮集成的完整Slack bot服务

    请参阅与迁移旧懈怠应用到颗粒作用域帮助。 自己做 仅此库仅会注册一个新的机器人,而不会包含任何机器人功能。 为了使事情有用,我们建议您从 (处理一种事件)或 (句柄)开始各种事件)以引导您的项目。 用法 ...

    程序员需要经常刷题吗-scoped_attr_accessor:将私有和受保护的attr_accessor方法添加到您的类-或所有ruby

    您可以使用作用域访问器扩展单个类(及其子类),或者您可以扩展 ruby​​ 的整个类层次结构。 安装 将此行添加到应用程序的 Gemfile 中: gem 'scoped_attr_accessor' 然后执行: $ bundle 或者自己安装: $ gem ...

    Ruby中proc和lambda的两个区别

    在lambda中,return不是从proc中返回,而是从定义proc的作用域中返回. 代码如下: def one_method  p = Proc.new{return 10} #调用这个块的时候,从p的作用域直接返回10,因此下面的return将不会执行  result = p....

Global site tag (gtag.js) - Google Analytics