Monday, October 27, 2008

(1)类的定义

Ruby中定义类非常简单,只要在名称前加class关键字并以end结尾就可以了,一个惯例是类名被Ruby视为常量,所以按照命名常量的规则,类名应该以大写字母开头。下面是一个例子:
class Point
  @z=10  #你不应该在方法外部直接定义实例变量
  def initialize(x,y) #初始化方法用initialize关键字
    @x,@y=x,y
    @z=10 
  end
  def pp    
    print @z #通过@z来访问类内部的实例变量
  end
  def to_s #to_s 方法用于定义类对象转换为字符串的信息   
    "#{@x},#{@y}" 
  end
  def x  #定义getter 方法
    @x
  end
  def y #定义getter 方法
    @y
  end
  def x=(x_value) #定义setter 方法
    @x=x_value
  end
  def y=(y_value) #定义setter 方法
    @y=y_value
  end
  def setall #自定义定义setter 方法
    self.x=11
    self.y=22
  end
end
p=Point.new(1,2) #创建对象,这会调用initialize 方法对类进行初始化
p.pp  #调用方法

puts "1:#{p.x},#{p.y};"

p.x=3  # 修改x的值,实际上是调用方法p.x()=3
p.y=4

puts "2:#{p.x},#{p.y};"

p.setall

puts "3:#{p.x},#{p.y};"
就像我在上面代码中加的注释,一样你不能在Ruby的类中直接方法他的内部实例变量,必须通过定义方法来访问这些变量,而且如果你是一个Java程序员,记住类似类中第一行那样的定义是错误的,你不能在方法外直接声明一个实例变量然后给他赋值,这在Ruby中是不允许的。如果你要在类内容调用一个已经存在的实例变量,你可以通过self关键字,但是前提是你已经定义了setter和getter方法。
除此之外,Ruby还提供了一个方便的方法来定义setter和getter 方法,你可以通过attr_reader和attr_accssor来定义,比如:
class Point
  attr_accessor :x, :y # 通过Symbol方式定义实例变量的setter和getter方法
end


class Point
  attr_reader :x, :y  # 通过Symbol方式定义实例变量的getter方法
end


attr_reader "x", "y" #你可以通过给出实例变量的字符串名来定义getter或setter方法
还有一个关键字attr,他用于定义一个单一的实例变量的setter和getter方法:
attr :x        # 为 @x定义一个setter方法
attr :y, true  # 定义getter 和 setter 方法
记住,以上方式只能按照当前变量名的规则来给出setter和getter方法,如果你需要自定义的setter和getter方法,你必须自己手工完成,就像我们开始代码中那样。

No comments: