Skip to content

Instantly share code, notes, and snippets.

@lidaobing
Created November 1, 2010 15:19
Show Gist options
  • Save lidaobing/658328 to your computer and use it in GitHub Desktop.
Save lidaobing/658328 to your computer and use it in GitHub Desktop.
irb(main):001:0> a = Object.new
=> #<Object:0x7ff7a6ff6388>
irb(main):002:0> a.object_id #获取对象ID
=> 70350817702340
irb(main):003:0> a.class #获取对象类型
=> Object
irb(main):004:0> Integer.superclass #获取父类
=> Numeric
irb(main):006:0> Numeric.superclass #...
=> Object
irb(main):007:0> Object.superclass #Object父类为 nil
=> nil
irb(main):011:0> Integer.ancestors #获取类的父类及 include 的类
=> [Integer, Precision, Numeric, Comparable, Object, Kernel]
irb(main):013:0> Integer.class #类的类型是 Class
=> Class
irb(main):019:0> 1.methods #查找对象的方法
=> ["%", ...]
irb(main):020:0> 1.public_methods #查找对象的公开方法
irb(main):022:0> 1.protected_methods #查找对象的保护方法
irb(main):023:0> 1.private_methods #查找对象的私有方法
irb(main):029:0> class << a
irb(main):030:1> def foo; end
irb(main):031:1> end
=> nil
irb(main):032:0> a.singleton_methods #查找对象的单例方法
=> ["foo"]
irb(main):033:0> a.methods.grep /methods/ #快速查询方法
=> ["public_methods", "methods", "singleton_methods", "protected_methods", "private_methods"]
irb(main):034:0> Integer.methods #类也是对象,也有 :methods
=> ["private_class_method", ...]
irb(main):036:0> Integer.instance_methods #获取实例方法
irb(main):037:0> Integer.public_instance_methods #...
irb(main):038:0> Integer.protected_instance_methods #...
irb(main):039:0> Integer.private_instance_methods #...
irb(main):041:0> 1.method :times #获取方法对象
=> #<Method: Fixnum(Integer)#times>
irb(main):042:0> 1.method(:times).call #执行方法对象
=> #<Enumerable::Enumerator:0x7ff7a703fb78>
irb(main):044:0> 1.send :times #执行方法对象
=> #<Enumerable::Enumerator:0x7ff7a7019090>
irb(main):045:0> 1.__send__ :times #执行方法对象
=> #<Enumerable::Enumerator:0x7ff7a6ffd1b0>
irb(main):047:0> m = 1.method :times
=> #<Method: Fixnum(Integer)#times>
irb(main):048:0> m.name #方法名称
=> "times"
irb(main):051:0> m.owner #方法所在的类
=> Integer
irb(main):054:0> m.to_proc #转成 Proc 对象
=> #<Proc:0x00007ff7a6f955d8@(irb):54>
irb(main):055:0> m.unbind #解除绑定
=> #<UnboundMethod: Fixnum(Integer)#times>
irb(main):056:0> m.arity #最少参数个数
=> 0
irb(main):057:0> m.receiver #绑定的对象
=> 1
irb(main):058:0> m = Integer.instance_method :times #获取未绑定的对象
=> #<UnboundMethod: Integer#times>
irb(main):060:0> m.bind(1) #绑定
=> #<Method: Fixnum(Integer)#times>
irb(main):061:0> m.owner #方法所在的类
=> Integer
irb(main):062:0> m.arity #最少参数个数
=> 0
irb(main):063:0> m.bind(Object.new) #绑定时会做类型检查
TypeError: bind argument must be an instance of Integer
from (irb):63:in `bind'
from (irb):63
from :0
irb(main):075:0> Integer.method_defined? :times #查询类的实例方法是否被定义
=> true
irb(main):076:0> Integer.public_method_defined? :times
=> true
irb(main):077:0> Integer.protected_method_defined? :times
=> false
irb(main):078:0> Integer.private_method_defined? :times
=> false
irb(main):089:0> 1.respond_to? :times #检查对象是否有方法
=> true
irb(main):092:0> 1.respond_to? :raise
=> false
irb(main):093:0> 1.respond_to? :raise, true #同时检查私有方法
=> true
irb(main):106:0> [1.class, 1.class.superclass]
=> [Fixnum, Integer]
irb(main):098:0> 1.is_a? Fixnum #检查1是否是 Fixnum 或其子类的对象
=> true
irb(main):099:0> 1.is_a? Integer #检查1是否是 Integer 或其子类的对象
=> true
irb(main):103:0> 1.instance_of? Fixnum #检查1是否是 Fixnum 的对象
=> true
irb(main):104:0> 1.instance_of? Integer #检查1是否是 Integer 的对象
=> false
irb(main):108:0> Fixnum.instance_methods - Integer.instance_methods #查看 Fixnum 类新添加的实例方法
=> ["%", "<<", "&", ">>", "to_sym", "*", "+", "-", "/", "|", "size", "~", "^", "**", "to_f", "id2name", "[]"]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment