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

 
  1. Ruby中类的写法  
  2.  定义一个class  
  3.  class Song  
  4.   def initialize(name,artist,duration)  
  5.     @name = name  
  6.     @artist = artist  
  7.     @duration = duration  
  8.   end  
  9.  end  
  10.  定义了一个歌曲Song类,类名首字母要大写,@开头为实例变量  
  11.  initialize相当于java中的构造函数,在创建对象的时候会调用此函数,传入参数  
  12.  song = Song.new("往前一步","孟非",240)  
  13.  song.inspect 默认将对象的id和实例变量格式化  
  14.  inspect输出地格式不合适,ruby中可以给类重写to_s方法(有点像java中的toString())  
  15.  class Song  
  16.   def to_s  
  17.     "Song:#@name--#@artist(#@duration)"  
  18.   end  
  19.   song.to_s就可以输出定义好的格式  
  20.    
  21.   (2)类的继承  
  22.       现在需要给歌曲添加歌词  
  23.       class KoraokeSong < Song  
  24.         def initialize(name,artist,duration,lyrics)  
  25.           super(name,artist,duration)  
  26.           @lyrics = lyrics  
  27.         end  
  28.       end  
  29.      67页  
  30.     (3)对象和属性  
  31.      一个类的完整写法:  
  32.      class Song  
  33.        def initialize(name,artist,duration)#构造器  
  34.          @name = name  
  35.          @artist = artist  
  36.          @duration = duration  
  37.        end  
  38.        #读写属性,相当于java中的getter,setter  
  39.        attr_reader :name,:artist,:duration  
  40.        attr_writer :name,:artist,:duration  
  41.        #getter/setter的另外一种写法  
  42.        #def name  
  43.        #  @name  
  44.        #end  
  45.        #def artist  
  46.        #  @artist  
  47.        #end  
  48.        #def duration  
  49.        #  @duration  
  50.        #end  
  51.        #setter  
  52.        #def name=(new_name)  
  53.        #  @name = new_name  
  54.        #end  
  55.        #...  
  56.      end  
  57.     好一个完整的类就写好了。。。  
  58.     这样new一个对象 song = Song.new("The Mass","abc",260)  
  59.     song.name #访问属性,getter()  
  60.     song.name = "My Love" #修改属性值,setter()  
  61.   
  62.     (4)ruby中的虚拟属性  
  63.     现在我们要将秒为单位的时间,换成分钟  
  64.     def duration_in_minutes  
  65.        @duration/60.0  
  66.     end  
  67.     def duration_in_minutest=(new_duration)  
  68.       @duration = (new_duration*60).to_i  
  69.     end  
  70.     song = Song.new("a","b",260);  
  71.     song.duration_in_minutes --> 4.333  
  72.     song.duration_in_minutes = 4.2  
  73.     song.duration --> 252  
  74.       
  75.     duration_in_minutes并不是实例变量  
  76.     对外界而言,她和其他属性是一样,  
  77.     在内并没有对应的实例变量。  
  78.   (5)熟悉几个概念  
  79.   属性、实例变量和方法  
  80.   song.name #返回实例变量的值  
  81.   song.duration_in_minutes  #返回计算后的结果  
  82.   song.duration_in_minutes = 3.8  
  83.   #等号结尾的方法  
  84.    
  85.   (6)类变量  
  86.   @@play  
  87.     class Song  
  88.     @@play=0  
  89.     def initialize(name,artist,duration)  
  90.       @name = name  
  91.       @artist = artist  
  92.       @duration = duration  
  93.       @play = 0  
  94.      end  
  95.      def play  
  96.        @play = @play + 1  
  97.        @@play =@@play + 1  
  98.        "this song #@play plays. Total #@@play palys."  
  99.        #xx 播放xx次,总共播放xx次。  
  100.      end  
  101.     end  
  102.     类变量是属于类的。  
  103.     实例变量是属于每一个对象的。  
  104.     (java中有静态变量,静态方法,静态类都是属于类的,通过类名直接调用)  
  105.     (实例变量有点像一般的java中的一般变量)  
  106.     (7)类方法  
  107.     有点象java中的静态方法,类名直接调用  
  108.     当我们的歌曲时间太长了,可以给类定义一个方法  
  109.     class SongList  
  110.       MAX_TIME = 5*60  
  111.       def SongList.is_too_long(song)  
  112.         return song.duration > MAX_TIME  
  113.       end  
  114.     end  
  115.     我们会发现类方法遍布于ruby库中,例如  
  116.     File类的对象用来表示在底层文件系统中打开的一个文件。File类提供了几个类方法来操作文件,而他们并未打开文件,因此也没有相应的File对象,如果你想要删除一个文件,你可以调用类方法File.delete,传入文件名作为参数。  
  117.     File.delete("test.txt")  
  118.     (8)单例和其他的构造函数  
  119.       需求:记录点唱机发生的所有事情:  
  120.           播放的歌曲,收到的点歌费,  
  121.           倾倒进去的各种奇怪液体等等  
  122.       因为我们期望为音乐保留网络宽带,  
  123.       因此我们将日志文件保存在本地。  
  124.       日志类,但是只有一个,单例模式  
  125.       class MyLogger  
  126.         private_class_method :new  
  127.         @@logger = nil  
  128.         def MyLogger.create  
  129.             @@logger = new unless @@logger  
  130.             @@logger  
  131.         end  
  132.         返回的对象都是一个,可以通过查看方法的返回对象的标识来检验  
  133.         MyLogger.create.object_id --> 24031056  
  134.       end  
  135.         
  136.       可以添加类方法对类进行扩展功能  

你可能感兴趣的:(ruby中类的写法以及属性,实例变量,类方法的用法 .)