最近对红宝石很感兴趣。喜欢rails的简约,喜欢ruby的人性化。《Ruby元编程》它讲述了你和Bill(一个资深的Ruby程序员)在办公室一周发生的故事。读完后感觉对编程有了一个新的了解。关于“元”这个字眼。到周天再解释吧。
话不多说,先看一段代码进入今天的主题。
- 类打开技术
3.times do
class C
puts "Hello"
end
=> Hello
Hello
Hello
//====================
Class D
def x; 'x' end
end
Class D
def y; 'y' end
end
obj = D.new
obj.x =>'x'
obj.y =>'y'
我们知道在Java是一种编译后在虚拟机中运行中的静态的语言,不允许在同一个包里面有两个相同的类出现,更不允许,在类定义后,重新去定义。ruby作为一种动态类拥有以上的特别的写法。
如上 C类不是被定义了3个,而是执行了3次。
D类第一次定义了一个x方法,返回值为'x'。第二次又定义了一个y方法,返回'y'。
我们称以上的技术叫“打开类”技术。非常的灵活。当然打开类也有不好的地方,比如类污染。
- 类的真相
1.一个对象的实例变量存在于对象本身,而一个对象的方法存在于对象自身的类。
String.instance_methods == "abc".methods # true
String.methods == "abc".methods #false
2.类自身也是对象。
1."hello".class # => String
String.class # =>Class
2. Class.instance_methods #=> [:superclass,:allocate,:new]
3. String.superclass #=> Object
Object.superclass #=>BasicObject
BasicObject.superclass #=> nil
4. Class.superclass # => Module
Module.superclass #=>Object
5. class Myclass;end
obj1 = Myclass.new
obj2 = Myclass.new
类和其他对象一样也有自己的类(如1),它的名字叫做Class。类中也有方法(如2),所有的类最终都继承与Object,Object本身又继承BasicObject,BasicObject是ruby体系的根节点。(如3).一个类只不过是一个增强的Module,增加了3个方法 new , allocate, superclass(如4).obj1和Myclass 都是一个引用,唯一的区别是obj1是一个变量,而Myclass是一个常量(任何以大写字母开头的引用)。
- 总结
对象无非就是一组实例变量外加一个指向其类的引用。对象的方法并不存在于对象中,而存在类中。这些方法称为类的实例方法。
类无非就是一个对象外加一组实例方法和易对其超类的引用。Class类是Moudule类的子类。因此类也是一个模块。
跟任何其他对象一样,类有自己的方法,比如new方法。这些是Class类的实例方法。跟其他对象一样,类必须通过引用进行访问。你已经使用过常量引用过它们:这就是类的名字。
本人为ruby新手,希望各路高手轻喷。