美文网首页
Ruby 扩展类 + 继承

Ruby 扩展类 + 继承

作者: changsanjiang | 来源:发表于2017-10-21 19:39 被阅读141次

    扩展类

    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__]
    

    相关文章

      网友评论

          本文标题:Ruby 扩展类 + 继承

          本文链接:https://www.haomeiwen.com/subject/hkjiuxtx.html