ruby中一切皆对象。
对象本质乃一内存片段之存在,由其子片段之类型、长度、顺序来表征。子片段取值各异,则对象各异。对象之方法定义了对内存片段中每个子片段可运用的运算集合。所以说对象是带有函数的数据。方法只需要用@offset来引用子片段(属性),无需知道名称,名称只是给人辨识的。
对象从何而存在?如何在内存中创建特定的类型、长度和顺序?此种信息即包含在类定义中。类也是对象,它通过对象的内存布局信息(对象模型)来分配内存(new方法),然后让对象自己用initialize方法填写子片段的值。虽然class XXX是一个大写的名字,但是这只是表明XXX是一个常量引用,其实它就是引用到了一个类对象。虽然类的实例叫对象,但既然类也是对象,这里为了区别起见,把对象和类分别叫做实例对象和工厂对象,因为类的表现就跟工厂方法一样。实例对象的class属性记录它是被哪个工厂对象造出来的。工厂对象自己又是被上层对象创造出来的,这个对象叫Class,它的产品都是工厂对象。工厂还知道自己定义的方法都是哪些,哪些是未定义的,方法的可访问性等。
class C; end
a=C.new
#[a,a.class,C.class,C.class.new,C.class.new.new].each {|x| p x,x.methods.sort!} 第一个和最后一个是实例对象,其他都是工厂对象
p a.methods.sort!
p a.methods-C.class.new.new.methods
p C.class.methods-a.class.methods
p a.class.methods-C.class.new.methods
p C.class.methods-a.methods
打印结果如下:
[:!, :!=, :!~, :==, :===, :=~, :__id__, :__send__, :class, :clone, :define_singleton_method, :display, :dup, :enum_for, :eql?, :equal?, :extend, :freeze, :frozen?, :gem, :hash, :inspect, :instance_eval, :instance_exec, :instance_of?, :instance_variable_defined?, :instance_variable_get, :instance_variable_set, :instance_variables, :is_a?, :kind_of?, :method, :methods, :nil?, :object_id, :private_methods, :protected_methods, :public_method, :public_methods, :public_send, :respond_to?, :send, :singleton_methods, :taint, :tainted?, :tap, :to_enum, :to_s, :trust, :untaint, :untrust, :untrusted?] 表明基对象的方法,注意id、send、很多的比较操作符、hash等。
[] 说明无新的方法
[:nesting] Class对象的方法比普通的工厂对象多一个nesting
[] 这2个工厂对象也是一样的
[:nesting, :constants, :allocate, :new, :superclass, :<=>, :<, :<=, :>, :>=, :included_modules, :include?, :name, :ancestors, :instance_methods, :public_instance_methods, :protected_instance_methods, :private_instance_methods, :const_get, :const_set, :const_defined?, :const_missing, :class_variables, :remove_class_variable, :class_variable_get, :class_variable_set, :class_variable_defined?, :module_exec, :class_exec, :module_eval, :class_eval, :method_defined?, :public_method_defined?, :private_method_defined?, :protected_method_defined?, :public_class_method, :private_class_method, :autoload, :autoload?, :instance_method, :public_instance_method] 表明工厂对象比实例对象多很多元信息