ruby中类方法与实例方法调用

转载 2013年12月02日 14:38:59

ruby中类方法与实例方法调用



对此略懂, 简单解答下你的问题, 这块确实是ruby深入理解的关键点.

首先,要明白一点: Ruby一切皆对象.

什么意思呢? Ruby一个类也是一个对象(使用XX.class知道它的类是Class),它也具备方法(即所谓的类方法).这个可以称之谓元类(MetaClass)

而Ruby中调用方法逻辑很简单:
1. 查询该对象所属类中的所有方法,如果存在调用之,如果不存在则调用父类的方法.
2. 如果回溯到顶级类,还不存在则调用method_missing, 默认抛出NoMethodError异常.

那分析下该输出
i1 = T1.new

puts "i1.get_v1: #{i1.get_v1}" #输出 bbb in init##i1属于类T1的实例,调用T1的方法get_v1,得到结果.

puts "T1.get_v1: #{T1.get_v1}" #输出 ! aaa !##这里调用T1的元类,即所写的self.get_v1, 得到 ! aaa !

puts "i1.v1: #{i1.v1}" #输出 bbb in init ##与第一个一致, 值得一提,attr_xx系列方法是一个魔法,是Module中提供的方法,用在这里生成新的方法.

puts "i1.get2: #{i1.get2}" #输出 ! @@ v2 !##这个类变量输出,通过实例取得类变量的值.

puts "i1.get3: #{i1.get3}" #输出 @@ v3 in init ##同上

puts "i1.v3: #{i1.v3}" #输出 这里是空的 ## 未赋值,当然是空的.记住在方法中self指向类,而在类中self指向元类.所以在类中使用@var赋值,这个变量属于元类而不是你期望的类.

puts "i1.vtest: #{i1.vtest}" #输出 vtest ## 这个同之前的分析

#puts "T1.vtest: #{T1.vtest}" 报错 ##元类不存在该方法,当然报错,你可以使用 class<<self
#attr_reader :vtest
#end
来打开元类的该方法,当然再赋个值,要不是空值.


这里讲的比较简单,参考:http://thinkinginruby.group.iteye.com/group/wiki/1275-class-with-the-module

更可以搜索Google: 关键字 Ruby MetaClass

 

转自lyf blog

ruby中类的写法以及属性,实例变量,类方法的用法

Ruby中类的写法 定义一个class class Song def initialize(name,artist,duration) @name = name @artist...
  • feihuale
  • feihuale
  • 2011年11月16日 12:28
  • 3947

Ruby之旅(二) Ruby的基本语法以及对象的使用,方法的定义及调用,属性的定义及使用

Ruby之旅(二) Ruby的基本语法以及对象的使用,方法的定义及调用,属性的定义及使用 (一)Ruby中一切都是对象,包括一个常数. 比如可以用.class属性来查看一个对象的类型,你可...
  • sunyllove
  • sunyllove
  • 2016年09月07日 14:35
  • 1116

Ruby-方法调用

=begin 方法的调用:  当你在调用某一个方法的时候,Ruby会完成下面的事务: Step 1: 找到这个方法,我们把这个过程称作方法查找method lookup; Step...
  • Spark2008
  • Spark2008
  • 2011年11月28日 10:38
  • 2444

Ruby中的各种方法定义和调用(函数式方法|实例方法|类方法)

1.ruby方法的定义 (1)不带参数的方法 def function_name   statement …… end 调用方式: function_name or function_n...
  • wangjianno2
  • wangjianno2
  • 2016年06月18日 02:40
  • 2765

Ruby中的各种方法定义和调用(函数式方法|实例方法|类方法)

1.ruby方法的定义 (1)不带参数的方法 def function_name   statement …… end 调用方式: function_name or function_n...
  • wangjianno2
  • wangjianno2
  • 2016年06月18日 02:40
  • 2765

【Ruby】模块扩展方法介绍

当我们要扩展类的方法时,我们可以采取Mixin的方式将模块中的方法添加到类中,下面会对实现的几种方式进行详细介绍。...
  • sunset108
  • sunset108
  • 2015年10月18日 13:48
  • 1096

Ruby类方法 实例方法

ruby的类方法与实例方法 类方法也叫静态方法,通过类名来调用的方法。实例方法,必须要new一个实例出来才能用。 class Foo def self.bar puts 'clas...
  • qq550764107
  • qq550764107
  • 2014年05月02日 11:27
  • 1230

rails/ruby 查找类的方法

总所周知,rails作为很强大的web框架,rails的语言ruby里的类会有很多方法,甚至一个类中一些方法可以实现同样的效果,那么这么多方法怎么查到自己想要的方法呢? 2.1.1 :001 > A...
  • feigeswjtu
  • feigeswjtu
  • 2016年03月31日 22:30
  • 883

Ruby方法参数默认值的一个小技巧在Rails中的应用

我们需要生成一个gravatar格式的html.image标示,于是写了如下方法:def gravatar_for(user) gravatar_id = Digest::MD5::h...
  • mydo
  • mydo
  • 2017年01月15日 09:39
  • 1399

rails模块学习之Controller

控制器简单介绍 一个简单的控制器中的例子 Ruby代码   class SimpleController    def index     end   end   ...
  • qwbtc
  • qwbtc
  • 2016年04月28日 17:13
  • 1826
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ruby中类方法与实例方法调用
举报原因:
原因补充:

(最多只允许输入30个字)