Ruby 扩展类 + 继承

2017-10-21  本文已影响141人  changsanjiang

扩展类

Ruby 允许我们在已经定义好的类中添加方法. 我们来试试给 String 类添加一个计算字符串单词数的实例方法 count_word.

class String
    def count_word
        ary = self.split(/\s+/) # 用空格分割self
        # 分解成数组
        # 返回分给后的数组的元素总数
        return ary.size
    end
end

str = "Just Another Ruby Newbie"

p str.count_word  #=> 4


继承

利用继承, 我们可以在不修改已有类的前提下, 通过增加新功能 或 重定义已有功能等来创建新的类.

要定义继承, 可以使用 class 语句指定类名的同时指定父类名.

class 类名 < 父类名
  类定义
end

这里我们创建一个继承了 Array 类的 RingAarry 类.

class RingArray < Array    # 指定父类
  def [](i)        # 重定义运算符`[]`
    idx = i % size  # 取余, 防止溢出计算新索引值,
    super(idx)  # 调用父类中同名的方法
  end
end

wday = RingArray["日", "月", "火", "水", "木", "金", "土"]
p wday[6] #=> "土"
p wday[11] #=> "木"
p wday[-1]#=> "土"

利用继承, 我们可以把共同的功能定义在父类, 把各自独有的功能定义在子类.
定义类时, 没有指定父类的情况下, Ruby 会默认该类为 Object 类的子类.
Object 提供了很多便于实际编程的方法. 但在某些情况下, 我们也有可能希望使用轻量级的类, 而这时就可以使用 BasicObject 类.
BasicObject 类只提供了作为 Ruby 对象的最低限度的方法. 类对象调用 instance_methods 方法后, 就会以符号的形式返回该类实例方法列表.

>> BasicObject.instance_methods
=> [:!, :==, :!=, :__send__, :equal?, :instance_eval, :instance_exec, :__id__]

>> Object.instance_methods
=> [:instance_of?, :public_send, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :private_methods, :kind_of?, :instance_variables, :tap, :define_singleton_method, :is_a?, :public_method, :extend, :singleton_method, :to_enum, :enum_for, :<=>, :===, :=~, :!~, :eql?, :respond_to?, :freeze, :inspect, :display, :object_id, :send, :to_s, :method, :nil?, :hash, :class, :singleton_class, :clone, :dup, :itself, :taint, :tainted?, :untaint, :untrust, :trust, :untrusted?, :methods, :protected_methods, :frozen?, :public_methods, :singleton_methods, :!, :==, :!=, :__send__, :equal?, :instance_eval, :instance_exec, :__id__]
上一篇 下一篇

猜你喜欢

热点阅读