ruby 创建基本的类

由于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代码还能稍微感到一点乐趣。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值