ruby中类的写法以及属性,实例变量,类方法的用法

Ruby中类的写法
 定义一个class
 class Song
  def initialize(name,artist,duration)
    @name = name
    @artist = artist
    @duration = duration
  end
 end
 定义了一个歌曲Song类,类名首字母要大写,@开头为实例变量
 initialize相当于java中的构造函数,在创建对象的时候会调用此函数,传入参数
 song = Song.new("往前一步","孟非",240)
 song.inspect 默认将对象的id和实例变量格式化
 inspect输出地格式不合适,ruby中可以给类重写to_s方法(有点像java中的toString())
 class Song
  def to_s
    "Song:#@name--#@artist(#@duration)"
  end
  song.to_s就可以输出定义好的格式
 
  (2)类的继承
      现在需要给歌曲添加歌词
      class KoraokeSong < Song
        def initialize(name,artist,duration,lyrics)
          super(name,artist,duration)
          @lyrics = lyrics
        end
      end
     67页
    (3)对象和属性
     一个类的完整写法:
     class Song
       def initialize(name,artist,duration)#构造器
         @name = name
         @artist = artist
         @duration = duration
       end
       #读写属性,相当于java中的getter,setter
       attr_reader :name,:artist,:duration
       attr_writer :name,:artist,:duration
       #getter/setter的另外一种写法
       #def name
       #  @name
       #end
       #def artist
       #  @artist
       #end
       #def duration
       #  @duration
       #end
       #setter
       #def name=(new_name)
       #  @name = new_name
       #end
       #...
     end
    好一个完整的类就写好了。。。
    这样new一个对象 song = Song.new("The Mass","abc",260)
    song.name #访问属性,getter()
    song.name = "My Love" #修改属性值,setter()

    (4)ruby中的虚拟属性
    现在我们要将秒为单位的时间,换成分钟
    def duration_in_minutes
       @duration/60.0
    end
    def duration_in_minutest=(new_duration)
      @duration = (new_duration*60).to_i
    end
    song = Song.new("a","b",260);
    song.duration_in_minutes --> 4.333
    song.duration_in_minutes = 4.2
    song.duration --> 252
    
    duration_in_minutes并不是实例变量
    对外界而言,她和其他属性是一样,
    在内并没有对应的实例变量。
  (5)熟悉几个概念
  属性、实例变量和方法
  song.name #返回实例变量的值
  song.duration_in_minutes  #返回计算后的结果
  song.duration_in_minutes = 3.8
  #等号结尾的方法
 
  (6)类变量
  @@play
    class Song
    @@play=0
    def initialize(name,artist,duration)
      @name = name
      @artist = artist
      @duration = duration
      @play = 0
     end
     def play
       @play = @play + 1
       @@play =@@play + 1
       "this song #@play plays. Total #@@play palys."
       #xx 播放xx次,总共播放xx次。
     end
    end
    类变量是属于类的。
    实例变量是属于每一个对象的。
    (java中有静态变量,静态方法,静态类都是属于类的,通过类名直接调用)
    (实例变量有点像一般的java中的一般变量)
    (7)类方法
    有点象java中的静态方法,类名直接调用
    当我们的歌曲时间太长了,可以给类定义一个方法
    class SongList
      MAX_TIME = 5*60
      def SongList.is_too_long(song)
        return song.duration > MAX_TIME
      end
    end
    我们会发现类方法遍布于ruby库中,例如
    File类的对象用来表示在底层文件系统中打开的一个文件。File类提供了几个类方法来操作文件,而他们并未打开文件,因此也没有相应的File对象,如果你想要删除一个文件,你可以调用类方法File.delete,传入文件名作为参数。
    File.delete("test.txt")
    (8)单例和其他的构造函数
      需求:记录点唱机发生的所有事情:
          播放的歌曲,收到的点歌费,
          倾倒进去的各种奇怪液体等等
      因为我们期望为音乐保留网络宽带,
      因此我们将日志文件保存在本地。
      日志类,但是只有一个,单例模式
      class MyLogger
        private_class_method :new
        @@logger = nil
        def MyLogger.create
            @@logger = new unless @@logger
            @@logger
        end
        返回的对象都是一个,可以通过查看方法的返回对象的标识来检验
        MyLogger.create.object_id --> 24031056
      end
      
      可以添加类方法对类进行扩展功能


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值