Keep

Ruby: 面向对象

发布:

对象:一些[内部]变量,一些方法以及特殊引用[super]

class A
  def hello = "hello"
  def to_s = "A"
end

p A.class                     # Class; 定义的类 A 是对象,是 Class 的实例
p A.instance_of? Class        # true; A 作为 Class 实例就有 Class#superclass 方法可调用
p Class.instance_of? Class    # true; Class 作为类,同时也是 Class 的实例; 类 Module/Object/BasicObject 同样如此
p Class.superclass            # Module; Module 是 Class 的父类,那么 A 就有 Module#ancestors 方法可用
p Module.superclass           # Object; Object 是 Module 的父类,那么 A 就有 Object#to_s 方法可用
p Object.superclass           # BasicObject; BasicObject 是 Object 的父类,那么 A 就有 BasicObject#__id__ 方法可用
p BasicObject.superclass      # nil; BasicObject 作为最顶层存在

p A.superclass                # Object; 使用关键字 [keyword] class 定义的类 A,默认父类是类 Object

# 方法 ancestors 返回 modules 和 superclass
p A.ancestors                 # [A, Object, Kernel, BasicObject];
p Object.ancestors            # [Object, Kernel, BasicObject];
p Class.ancestors             # [Class, Module, Object, Kernel, BasicObject];

a = A.new
p a.to_s                      # "A"
def a.bye = 'bye'             # 向 singleton_class 上添加 #bye 方法

# case
# a.hello -> a[receiver] -> A#hello
# a.bye   -> a[receiver] -> a.singleton_method(:bye).call

Class

继承关系

object

singleton_class

self[scope]

Variable

存在几种 scope 定义

  1. the toplevel(main),
  2. a class(or module) definition,
  3. a method definition
  4. block { ... }do ... end; 使用新定义的变量,在外部不可见;与外部已定义的变量重名时,直接使用外部变量 ps: Kernel#loop 是个方法

怎么知道方法在什么类上

先向右[self]再向上查找[class, …ancestors]

include

module T
  def hello = 1
end

class D
  include T
end

D.new.hello # 1

prepend

extend code

module Foo; @@foo = 'foo'; end
class Bar; extend Foo; end

p Bar.class_variables
p Bar.singleton_class.class_variables
p Bar.singleton_class.singleton_class.class_variables
p Bar.singleton_class.singleton_class.class_variable_get(:@@foo)
  1. 创建 Bar.singleton_class 类
  2. 在 Bar.singleton_class 中 include Foo

constant 查找过程

Struct

相关链接


avatar image

@read2025, 生活在北京(北漂),程序员,宅,马拉松[纯粹],喜欢动漫。"骑士总能救出公主,是因为恶龙从没伤害过她"