男人眼泪中的Ruby(三)

今天原本平稳的心情被一些事情所触动,深埋的东西被拔起的感觉总是痛痛的,不提太多了,还是专心写文章吧。说说今天这篇文章的关键字,看看有没有你能有用的: Class Hierarchies ,Accessors,Attributes,Class Variables。说白了今天就是Deep in Ruby Class了,不过这个 Deep 不够 Deep,只是在我个人的肤浅之上的Deep。

仔细说说,看完了Ruby的语法书,发现了ruby居然没有提供接口这个语法,而是用一个Module来取代了,这也就是说Ruby没有实现多继承,也就是只能有一个父类,然后可以有多个子类。Only one SuperClass and many Subclass。下面看看Ruby类面类继承的语法:

class Man
  def initialize(aName,aAge)
    @name=aName
    @age=aAge
  end
  def get_name
    return @name
  end
  def get_age
    return @age
  end
  def to_s
    return 'Good!!!'
  end
end

class SuperMan<Man
  def initialize(aName,aAge,aPower)
    super(aName,aAge)
    @power=aPower
  end
  def get_power
    return @power
  end
  def set_power
    return @power
  end
end

supermanABC=SuperMan.new('Jesse',21,100)
puts (supermanABC.get_power)
puts(supermanABC.inspect)

 

这个里面我们可以看到从类继承的语法就是一个<符号,很简洁。看了代码总是很清晰,只需要点一下就是那个super()访问超类,也就是subclass 调用superclass的构造函数了。 

我们在写ruby的class的属性的时候如果总是写get_power和set_power这样的函数,对这个属性操作的时候还都是要class.get_power之类感觉很麻烦,我们能不能把它整成直接这样访问 class.power=x,那样不是很爽啊。下面看看代码,了解一下ruby的accessor方法:

class SuperMan<Man
  def initialize(aName,aAge,aPower)
    super(aName,aAge)
    @power=aPower
  end
  def power
    return @power
  end
  def power=(aPower)
    @power=aPower
  end
end

supermanABC=SuperMan.new('Jesse',21,100)
supermanABC.power=98
puts (supermanABC.power)
puts(supermanABC.inspect)

 

改造了一下上面的SuperMan类,然后定义了power的accessor,很明显语法,不用抽出来讲了。不过感觉对于每个属性如果还是这样写的话也是比较麻烦,继续简化,整出下一个主角 Attribute Reader和Writer标签。看看下面的代码:

class SuperMan<Man
  attr_reader:power
  attr_writer:power
  
  def initialize(aName,aAge,aPower)
    super(aName,aAge)
    @power=aPower
  end
end

 

更加简化了吧,其实还可以更加简化,继续给出代码:

class SuperMan<Man  
  attr_accessor:power
  def initialize(aName,aAge,aPower)
    super(aName,aAge)
    @power=aPower
  end
end

 

一个标签就搞定了,其实个人比较推荐上面的attr_reader和attr_writer,因为你可以用def power这种方法的从在方便的对属性进行处理后在返回,看看下面的代码你就有所体会了:

class Man
  attr_writer:name
  def initialize(aName,aAge)
    @name=aName
    @age=aAge
  end
  def name
    return @name.capitalize
  end
end

superman=Man.new("jesse",21)
puts(superman.name)

 

这里的@name.capitalize是把这个属性值的首字母大写了输出。感觉这样更灵活一些,在灵活和方便的找到了一个折中。下面来说说Class Variables,这个是在所有的类的实例之间共享的一个变量。下面看看代码:

class Man
  attr_writer:name
  @@man_name=0
  def initialize(aName,aAge)
    @name=aName
    @age=aAge
    @@man_name+=1
  end
  def name
    return @name.capitalize
  end
  def get_man_name
    return @@man_name
  end
end

superman=Man.new("jesse",21)
superman1=Man.new("jesse1",22)
superman2=Man.new("jesse2",22)

puts superman.get_man_name
puts superman1.get_man_name
puts superman2.get_man_name

 

class variables的语法为@@varname。程序运行输出的结果都是3,这就说明他们之间是共享的。这个东西在有些地方很有用,大家多考虑考虑。

今天就写到这里吧。明天讲讲 hash 和 array 的内容。顺便说一下我们宿舍的小八也恋爱了,祝福他们。呵呵,不知道怎么搞得,心里突然很失落。也许我的爱情观改变了...

PS: 今天看完了《A little book of Ruby》 和 《Ruby on rails:up and running》这两本书,大强度的英语阅读下感觉慢慢的还是可以习惯英文阅读的。今天做个决定,以后技术书籍只要有英文版本尽量去看英文版。

posted on 2007-03-16 07:39  JesseZhao  阅读(2727)  评论(12编辑  收藏  举报

导航