ruby的所有类都继承自object,而object又继承自BasicObject(此类为ruby1.9新增)
类的定义
定义类使用关键字class,定义方法使用def,
例子:
class MyClass #定义类方法 def self.method1 puts "类方法mothod1" end #另一种方式定义类方法 def MyClass.method2 puts "另一种定义的类方法method2" end #定义实例方法 def method3 puts "实例方法method3" end end myclass = MyClass.new MyClass.method1 MyClass.method myclass.method
类方法相当于java中的静态方法,无须实例化可直接调用.但不能被实例化后的对象调用
定义属性又4个方法,attr,attr_reader,attr_writer,attr_accessor,他们的作用分别是只读或或可读属性,只读属性,只写属性,可读写属性,他们属于Module类的方法.
例子:
class MyClass attr_accessor :attr1 def attr2 @attr2 end def set_attr2(value) @attr2 = value end end myclass = MyClass.new myclass.attr1="attr1" puts myclass.attr1 myclass.set_attr2("attr2") puts myclass.attr2
访问控制
ruby提供三个关键字,public,protected,private.其中ruby默认的级别是public即没有任何限制.
protected级别的方法只能被该类自身和其子类的对象 所调用
private级别的方法只能被self调用,换句话来说就是只能被其自身和子类自身的方法的调用.
例子:
class MyClass #默认是public def public_method puts "public_method" end #定义protected方法 protected def protected_method puts "protected_method" end #定义private方法 private def private_method puts "private_method" end end class MySubClass<MyClass #调用父类中的protected方法 def call_protected_method protected_method end #调用父类的private方法 def call_private_method private_method end end my_sub_class = MySubClass.new my_sub_class.call_protected_method my_sub_class.call_private_meth
类的扩展和继承
通过代码
puts 1.class.name
可知
1是Fixnum的一个实例,下面就对Fixnum进行扩展
class Fixnum def speak puts "我的值是#{self}" end def abs puts "abs不能用了" end end #扩展类方法 def Fixnum.say_hello puts "Hello!" end 1.speak -1.abs Fixnum.say_hello
输出
我的值是1
abs不能用了
Hello!
self和super
ruby中的self用来引用自身,和java中的this功能相似.super关键字则用来引用父类的相同方法
例子:
class Person attr_accessor :name,:age def say_hello puts "你好,我是#{self.name}" end def say_age puts "我的年龄是#{self.age}" end end class Man<Person def sex "男" end def say_sex puts "我的性别是#{self.sex}" end def say_hello super say_age say_sex end end man = Man.new man.age=20 man.name="jone" man.say_hello
输出:
你好,我是jone
我的年龄是20
我的性别是男
ruby的构造方法initialize和给对象创建属于对象的方法
class Man attr_accessor :myname,:myage #类的构造方法 def initialize(name,age) @myname = name @myage = age end end @myname = "test" @myage = 10 me = Man.new("jack", 30) #为对象定义方法 def me.about_me puts "我叫#{self.myname},年龄是#{self.myage}" end me.about_me
最后再说下ruby的==和equal?
对于数值形来说这两个貌似没什么区别
对于字符串来说
==比较的是字符串是否相同
equal?比较的是是否是同一个字符此
如:
a="123"
b="123"
a==b 返回true
a.equal? b 返回false