`
magixyu
  • 浏览: 80190 次
  • 性别: 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)开发者提供深入指导的专业参考手册。尽管该书尚处于开发阶段,但其目标是...

    Advanced RESTful Rails Presentation

    - **Rails**:Ruby on Rails 的简称,是一种用 Ruby 语言编写的全栈 Web 开发框架。 #### 描述:关于高级RESTful Rails应用的演示 - **高级**:暗示了演示中将涵盖高级功能或技术。 - **RESTful Rails**:结合REST...

    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