`
magixyu
  • 浏览: 79807 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

Advanced Rails -- Ruby 基本技术(2) -- Ruby 基础1

    博客分类:
  • ROR
阅读更多
Ruby 基础

类和方法

类和方法是Ruby里面向对象的基础。类便利了关系的包装和分解。模块可以用来做mixins—用一替代多继承来把一堆功能添加到类里面已增加类的行为。模块的另一个作用就是把类分到命名空间(namespace) 里。

在Ruby里,类的名字是一个常量。这就是为什么Ruby要求类的名字必须以大写字母开头的原因。这些常量会记值在类的对象里,这个对象就是类Class的一个对象。这个和Class对象是不同的,Class是一个类。“class object”表示一个类。“Class object”是一个类,名字是Class,它是所有类对象的superclass。

类Class继承与Module,所有的类因此也是一个模块。但是Classes不能做mixins,也不能扩展一个对象。

方法的查找

每一Ruby的对象(除了Fixnums,symbols,true,false,nil)都有下面这些字段的集合:
klass
指向这个对象的类对象
iv_tbl
是储存这个对象实例变量的Hash表
flags
状态信息
m_tbl
方法表
super
指向父类的指针


规则

1. Ruby跟随接受者kclass的指针,搜索这个类m_tbl
2. 如果没有找到,Ruby跟踪类对象的super的指针,继续搜索m_tbl
3. Ruby用这种方式查找直到找到这个方法或者到了类链的顶部
4. 如果没有找到,Ruby在最初接受者调用method_missing。然后用同样的方法开始查找method_missing。
单类

单类也被称为元类,它允许一个对象的行为区别于同一个类的其他对象

	class A
	end

	objA = A.new
	objB = A.new
	objA.to_s # => "#<A:0x1cd0a0>"
	objB.to_s # => "#<A:0x1c4e28>"

	class <<objA # Open the singleton class of objA
	  def to_s; "Object A"; end
	end

	objA.to_s # => "Object A"
	objB.to_s # => "#<A:0x1c4e28>"


单类会被标示为一个虚拟类,这个类在Ruby里一般看不到,除非特意去做。当访问objA的类的时候,会利用klass和super指针一层一层的去查找,直到找到第一个非虚类。这也说明了,一个对象的klass不一定指向它的类对象。

Singleton classes of class objects

方法查找最基本的规则就是Ruby根据一个对象的klass指针搜索方法;然后Ruby在跟寻super指针一级一级的向上查找方法直到继承链的最顶端。

类也是对象。类也可以有单类(越来越难说明白了,呵呵,直接copy code了)


	class A
	end


	class A; end
	# from Module#to_s
	A.to_s # => "A"

	class Class
	  def to_s; "Class#to_s"; end
	end
	
	A.to_s # => "Class#to_s"


	class A; end
	class B; end

	class <<A
	  def to_s; "Class A"; end
	end

	A.to_s # => "Class A"
	B.to_s # => "B"


class method(类方法)定义的方式:
	class A
	  def A.class_method_one; "Class method"; end

	  def self.class_method_two; "Also a class method"; end

	  class <<A
	    def class_method_three; "Still a class method";
	  end
	end

	  class <<self
	    def class_method_four; "Yet another class method"; end
	  end
	end

	  def A.class_method_five
	    "This works outside of the class definition"
	  end

	  class <<A
	    def A.class_method_six
	      "You can open the metaclass outside of the class definition"
	    end
	  end

	  # Print the result of calling each method in turn
	  %w(one two three four five six).each do |number|
	    puts A.send(:"class_method_#{number}")
	  end

	  # >> Class method
	  # >> Also a class method
	  # >> Still a class method
	  # >> Yet another class method
	  # >> This works outside of the class definition
	  # >> You can open the metaclass outside of the class definition



这也讲述了在一个单类的定义里——和其他类的定义——self表示的是这个定义类对象。

方法丢失
总结一下,method_missing非常的简单。当整个方法查找的过程失败后, 就会用同样的方法查找method_missing。当method_missing找到后,它会用和最初的方法同样的参数,并且在前面加上自出的方法名以调用。任何的代码块都会通过。

默认的method_missing函数在Object(rb_method_missing) 触发一个异常。



分享到:
评论
4 楼 zsbfree 2008-07-07  
最后搞的比c++还诡异,呵呵
3 楼 flyinglife 2008-07-05  
ruby本来就诡异,难理解。你站在别人的角度理解下这个是什么意思:
【在Ruby里,类的名字是一个常量。这就是为什么Ruby要求类的名字必须以大写字母开头的原因。这些常量会记值在类的对象里,这个对象就是类Class的一个对象。这个和Class对象是不同的,Class是一个类。“class object”表示一个类。“Class object”是一个类,名字是Class,它是所有类对象的superclass。

类Class继承与Module,所有的类因此也是一个模块。但是Classes不能做mixins,也不能扩展一个对象。】

Class,class object,Class,superclass,把我搞晕了。希望你既然写教程,那么能想dhh和国外一些牛人一样写的教程初学者都能看的懂那么最好了。就上面那段,给我的感觉是:你潜意识里故意要搞晕读者,以显示你牛逼(恕我直言)。
2 楼 flyinglife 2008-07-05  
大哥,知道你牛,但是你写个教程认真点好不好,好多错别字,有些地方也稍微解释一下,谢谢了!!
1 楼 magixyu 2008-06-06  
请多多指教

相关推荐

    Advanced Rails

    "Advanced Rails" 涵盖了Rails开发中的高级主题和技术,是Ruby on Rails学习进阶的重要资源,尤其适合已经对基础Rails有一定了解的开发者。 在Web开发领域,Rails以其高效、简洁的代码和“约定优于配置”的哲学吸引...

    rails2-sample

    从给定的文件信息来看,我们正在探讨的是一本关于Ruby on ...综上所述,《Simply Rails2》不仅为初学者提供了全面的Ruby on Rails入门指南,也为进阶开发者提供了深入的技术细节和实践案例,是一本值得推荐的学习资料。

    Ruby-LockboxRuby和Rails的文件加密

    1. **加密算法支持**:Lockbox支持多种加密算法,如AES(Advanced Encryption Standard),RSA,ECB(Electronic Codebook),CBC(Cipher Block Chaining)等。AES是目前最常用的对称加密算法,而RSA则是一种非对称...

    Advanced Rails Recipes(随书源码)

    (Ruby Recipeswas is written for Rails 1.x,this book for Rails 2.0.) Ruby on Rails continues to build up a tremendous head of steam. Fueled by significant benefits and an impressive portfolio of real...

    Advanced Rails Recipes

    该书面向已经具备一定Rails开发基础的技术人员,提供了深入且实用的技术指导。 **描述:“Advanced Rails Recipes 正式版。不要资源分,免费提供,要下的赶快哦。。。”** 这段描述表明这本书是正式版本,并且作者...

    The Ruby Programming Language

    - **Advanced Rails**:针对高级Ruby on Rails开发者的深入指南。 - **Rails Cookbook**:涵盖Ruby on Rails框架中的各种常见问题解决方案。 - **Ruby Pocket Reference**:提供Ruby语言核心特性的快速参考手册。 - ...

    The Ruby Programming Language 2008 .pdf

    - **Advanced Rails**:专注于Ruby on Rails框架的高级用法和技术细节。 - **Rails Cookbook**:类似于Ruby Cookbook,但专门针对Rails框架。 - **Ruby Pocket Reference**:一本便携式的参考手册,涵盖了Ruby语言的...

    Advanced Rails Recipes(英语清晰文字pdf+源码)

    (Ruby Recipeswas is written for Rails 1.x,this book for Rails 2.0.) Ruby on Rails continues to build up a tremendous head of steam. Fueled by significant benefits and an impressive portfolio of real...

    Ruby-服务器优化的Ruby发行版通过APTYUM实现更少内存更快速易于安装和安全补丁

    Ruby是一种强大的动态编程语言,广泛用于Web开发,尤其是在Ruby on Rails框架中。为了在服务器环境中更好地利用Ruby,一些专门针对服务器优化的发行版被开发出来,以提高性能、减少资源消耗并简化管理。"Ruby-服务器...

    Advanced.Rails(2007)].Brad.Ediger.文字版.pdf

    综上所述,《Advanced Rails》是一本深度解析Rails框架高级特性的书籍,不仅覆盖了技术层面的知识点,还提供了丰富的学习资源和支持。对于希望提升Rails技能的开发者来说,本书具有很高的参考价值。

    advanced rury on rails recipes

    从给定的文件信息来看,我们探讨的主题是“高级Ruby on Rails食谱”(Advanced Rails Recipes),这是一本旨在为专业Ruby on Rails(RoR)开发者提供深入指导的专业参考手册。尽管该书尚处于开发阶段,但其目标是...

    Rails.Angular.Postgres.and.Bootstrap.2nd.Edition

    This book covers Postgres 9.5, Rails 5, and Ruby 2.3. You should have some experience with basic Rails concepts and a cursory understanding of JavaScript, CSS, and SQL, but by no means need to be an ...

    Advance RAils Reciples

    2. **高级编程技巧**:除了介绍Rails的基础知识外,《Advanced Rails Reciples》还深入探讨了Rails框架中的高级编程技巧,如性能优化、安全性增强等。 3. **实战案例分析**:书中通过多个实战案例来展示如何将Rails...

    RailsSpace

    本书通过构建一个面向Ruby社区的社交网络平台——RailsSpace,来帮助读者掌握Ruby on Rails的核心概念和技术。本书不仅适合初学者,也适合有一定基础并希望深入了解Rails框架的开发者。 #### 二、基础知识篇 #####...

Global site tag (gtag.js) - Google Analytics