由于ruby的语法很多,看过也难免会忘记,而且能看的时间也不是很多,所以尝试一点一点写进自己的博客里,加深一下印象。
一个基本的类的格式如下:
这个类的方法调用也很简单:
其实上面那个类还可以定义得更简单:
其中上面的attr_reader与attr_writer综合一下,就成了注释掉的那行代码attr_accessor。
也可以向Point中添加一些操作方法,如:
在ruby中,所有实例变量都隐式使用self,如果要使用self,可以这样使用self.x。从上面的这段代码可以看出,只要other对象具有x,y变量的访问方法即可,并不要求一定要是Point对象,这就是"Duck typing"方式,即只要看来像鸭子,就把它当做鸭子对待。
要覆盖equ也很简单,不过有几种方式,也可以写一个==方法:
其中最后一行代码表示eql当做==处理。
当然ruby也有关键字private、protected、public,这些关键字针对是实例方法:
1.如果没有声明,默认为public
2.initialize方法是private的
3.private方法只能隐式的调用,不能用o.m或self.m来调用
4.private只能被类或其子类的实例方法调用
5.protected除了能被类或其子类的实例方法调用外,可以被类的实例显示的调用,但该类的用户不能访问这些方法。
用法很简单:
定义类方法也还有点意思,类方法相当java的static方法,定义的方式大致有两种:
其中那个self可以用当前的类名代替。还有一种是为了方便定义多个类方法的:
这个相当java来说,其实是差不多的,只是感觉好玩了一点而已。
常量名字需要大写,可以在类内外定义,在内部可以直接访问,在外部必须通过"类名::常量名"的方式访问。如:
相对于java代码来说,的确精简了不少,说实话,写java代码一点优美感都没有,写ruby代码还能稍微感到一点乐趣。
一个基本的类的格式如下:
class Point
def initialize(x,y)
@x,@y=x,y
end
def x
@x
end
def y
@y
end
def x=(value)
@x=value
end
def y=(value)
@y=value
end
def to_s
"(#@x,#@y)"
end
end
这个类的方法调用也很简单:
p=Point.new(1,2)
p.x=3
p.y=4
print p
其实上面那个类还可以定义得更简单:
class Point
def initialize(x,y)
@x,@y=x,y
end
#attr_accessor :x,:y
attr_reader :x,:y
attr_writer :x,:y
def to_s
"(#@x,#@y)"
end
end
其中上面的attr_reader与attr_writer综合一下,就成了注释掉的那行代码attr_accessor。
也可以向Point中添加一些操作方法,如:
...
def +(other)
Point.new(@x+other.x,@y+other.y)
end
..
在ruby中,所有实例变量都隐式使用self,如果要使用self,可以这样使用self.x。从上面的这段代码可以看出,只要other对象具有x,y变量的访问方法即可,并不要求一定要是Point对象,这就是"Duck typing"方式,即只要看来像鸭子,就把它当做鸭子对待。
要覆盖equ也很简单,不过有几种方式,也可以写一个==方法:
def ==(o)
if o.is_a?(Point)
@x==o.x&&@y==o.y
elsif
false
end
end
alias eql? ==
其中最后一行代码表示eql当做==处理。
当然ruby也有关键字private、protected、public,这些关键字针对是实例方法:
1.如果没有声明,默认为public
2.initialize方法是private的
3.private方法只能隐式的调用,不能用o.m或self.m来调用
4.private只能被类或其子类的实例方法调用
5.protected除了能被类或其子类的实例方法调用外,可以被类的实例显示的调用,但该类的用户不能访问这些方法。
用法很简单:
def +(other)
Point.new(@x+other.x,@y+other.y)
end
def -(other)
Point.new(@x-other.x,@y-other.y)
end
private :-,:+
.........
定义类方法也还有点意思,类方法相当java的static方法,定义的方式大致有两种:
....
def self.sum(*points)
x=y=0
points.each{|p| x+=p.x;y+=p.y}
Point.new(x,y)
end
...
其中那个self可以用当前的类名代替。还有一种是为了方便定义多个类方法的:
class << self
def sum(*points)
x=y=0
points.each{|p| x+=p.x;y+=p.y}
Point.new(x,y)
end
end
......
这个相当java来说,其实是差不多的,只是感觉好玩了一点而已。
常量名字需要大写,可以在类内外定义,在内部可以直接访问,在外部必须通过"类名::常量名"的方式访问。如:
...
UNIT_X=Point.new(1,0)
UNIT_Y=Point.new(0,1)
...
Point::UNIT_X+Point::UNIT_Y
相对于java代码来说,的确精简了不少,说实话,写java代码一点优美感都没有,写ruby代码还能稍微感到一点乐趣。