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