扩展类
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__]
网友评论