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:
Post a Comment