1.在Ruby中定义类
在 Ruby 中,类总是以关键字 class 开始,后跟类的名称。类名的首字母应该大写。
class 类名
类的定义
end
类 Customer 如下所示:
class Customer
end
您可以使用关键字 end 终止一个类。类 中的所有数据成员都是介于类定义和 end 关键字之间。
2.Ruby类中的变量声明和定义
Ruby 提供了四种类型的变量:
(1)局部变量
局部变量是在方法中定义的变量。局部变量在方法外是不可用的。在后续的章节中,您将看到有关方法的更多细节。局部变量以小写字母或 _ 开始。
(2)实例变量
实例变量可以跨任何特定的实例或对象中的方法使用。这意味着,实例变量可以从对象到对象的改变。实例变量在变量名之前放置符号(@)。
(3)类变量
类变量可以跨不同的对象使用。类变量属于类,且是类的一个属性。类变量在变量名之前放置符号(@@)。
(4)全局变量
类变量不能跨类使用。如果您想要有一个可以跨类使用的变量,您需要定义全局变量。全局变量总是以美元符号($)开始。
3.创建类的对象实例
对象是类的实例。现在您将学习如何在 Ruby 中创建类的对象。在 Ruby 中,您可以使用类的方法 new 创建对象。方法 new 是一种独特的方法,在 Ruby 库中预定义。new 方法属于类方法。
下面的实例创建了类 Customer 的两个对象 cust1 和 cust2:
cust1 = Customer.new
cust2 = Customer.new
在这里,cust1 和 cust2 是两个对象的名称。对象名称后跟着等号(=),等号后跟着类名,然后是点运算符和关键字 new。
可以给方法 new 传递参数,这些参数可用于初始化类变量。当想要声明带参数的 new 方法时,您需要在创建类的同时声明方法 initialize。initialize 方法是一种特殊类型的方法,将在调用带参数的类的 new 方法时执行。
下面的实例创建了 initialize 方法:
class Customer
@@no_of_customers=0
def initialize(id, name, addr)
@cust_id=id
@cust_name=name
@cust_addr=addr
end
end
在本实例中,您可以声明带有 id、name、addr 作为局部变量的 initialize方法。在这里,def 和 end 用于定义 Ruby 方法 initialize。在 initialize 方法中,把这些局部变量的值传给实例变量 @cust_id、@cust_name 和 @cust_addr。在这里,局部变量的值是随着 new 方法进行传递的。
现在可以创建对象,如下所示:
cust1=Customer.new("1", "John", "Wisdom Apartments, Ludhiya")
cust2=Customer.new("2", "Poul", "New Empire road, Khandala")
在 Ruby 中,函数被称为方法。类中的每个方法是以关键字 def 开始,后跟方法名。方法名总是以小写字母开头。在 Ruby 中,您可以使用关键字 end 来结束一个方法。
下面的实例定义了一个 Ruby 方法:
class Sample
def function
statement 1
statement 2
end
end
在这里,statement 1 和 statement 2 是类 Sample 内的方法 function 的主体的组成部分。这些语句可以是任何有效的 Ruby 语句。下面的实例将创建类 Sample 的一个对象,并调用 hello 方法:
#!/usr/bin/ruby
class Sample
def hello
puts "Hello Ruby!"
end
end
# 使用上面的类来创建对象
object = Sample. new
object.hello
这将会产生下面的结果:
Hello Ruby!
5.ruby中类方法的定义和使用
ruby中类方法有如下几种方式来定义:
(1)class << 类名 ~ end
我们在 class << 类名 ~ end 这个特殊的类定义中,以定义实例方法的形式来定义类方法。实例如下:
class << HelloWorld
def hello(name)
puts "#{name} said hello."
end
end
HelloWorld.hello("John")
备注:class << 类名 ~ end 这种写法的类定义称为单例类定义,单例类定义中定义的方法称为单例方法。
在 class 上下文中使用 self 时,引用的对象是该类本身,因此,我们可以使用 class << self ~ end 这样的形式,在 class 上下文中定义类方法。示例如下:
class HelloWorld
class << self
def hello(name)
puts "#{name} said hello."
end
end
end
(3)def 类名.方法名 ~ end
可以使用 def 类名 . 方法名 ~ end 这样的形式来定义类方法。
def HelloWorld.hello(name)
puts "#{name} said hello."
end
HelloWorld.hello("John")
(4)def self.方法名 ~ end
实例如下:
class HelloWorld
def self.hello(name)
puts "#{name} said hello."
end
end
6.类的初始化方法initialize
使用 new 方法生成新的对象时,initialize 方法会被调用,同时 new 方法的参数也会被原封不动地传给initialize 方法。因此初始化对象时需要的处理一般都写在这个方法中。举例如下:
def initialize(myname = "Ruby")
@name = myname # 初始化实例变量
end
在这个例子中,initialize 方法接受了参数 myname。因此,
bob = HelloWorld.new("Bob")
像这样,就可以把 "Bob" 传给 initialize 方法生成对象。由于 initialize 方法的参数指定了默认值 "Ruby",因此,像下面这样没有指定参数时,
ruby = HelloWorld.new
会自动把 "Ruby" 传给 initialize 方法。
7.限制方法的调用
Ruby 提供了 3 种方法的访问级别,我们可以按照需要来灵活调整。
public ---以实例方法的形式向外部公开该方法
private ---在指定接收者的情况下不能调用该方法(只能使用缺省接收者的方式调用该方法,因此无法从实例的外部访问)
protected ---在同一个类中时可将该方法作为实例方法调用
举例说明如下:
class AccTest
def pub
puts "pub is a public method."
end
public :pub # 把pub 方法设定为public(可省略)
def priv
puts "priv is a private method."
end
private :priv # 把priv 方法设定为private
end
acc = AccTest.new
acc.pub
acc.priv
AccTest 类的两个方法中,pub 方法可以正常调用,但是在调用 priv 方法时程序会发生异常
8.类的继承
类的继承的格式如下:
class 类名 < 父类名
类定义
end
举例来说:
class RingArray < Array # 指定父类
def [](i) # 重定义运算符[]
idx = i % size # 计算新索引值
super(idx) # 调用父类中同名的方法
end
end
wday = RingArray["日", "月", "火", "水", "木", "金", "土"]
p wday[6]
p wday[11]
p wday[15]
p wday[-1]
学习资料来源于:
http://www.runoob.com/ruby/ruby-class.html