ruby 类和类方法 博客分类: ruby
Ruby类变量和类方法
类变量被类的所有对象所共享,它与类方法相关联,对一个给定的类来说,类变量只存在一份拷贝。类变量由两个@符开头,例如@@count。与全局变量和实例变量不同,类变量在使用之前必须被初始化。通常,初始化就是在类定义中的简单赋值。
例如,我们的点唱机可能希望记录每首歌被播放的次数。这个数目可能是Song对象的一个实例变量。当一首歌被播放时,实例中的值增加。但是,假如我们还想要了解下一共播放了多少首歌。通过搜索所有Song对象并累加它们的播放次数,或者冒天下之大不韪使用全局变量来完成统计;或者,让我们使用类变量。
class Song @@plays = 0 def initialize(name.artist,duration) @name = name @artlist = artist @duration = duration @plays = 0 end def play @plays += 1 #same as @plays = @plays +1 @@plays += 1 "This song:#@plays plays.Total #@@plays plays." end end
出于调试的目的,我们还让Song#play 返回一个字符串,其中包括该歌曲被播放的次数,以及所有歌曲播放的总次数。我们可以很容易测试它。
s1 = Song.new("Song1","Artist1",234) #test songs s2 = Song.new("Song2","Artist2",345) s1.play ->"This song:1 plays.Total 1 plays." s2.play ->"This song:1 plays.Total 2 plays." s1.play ->"This song:2 plays.Total 3 plays." s1.play ->"This song:3 plays.Total 4 plays."
类变量对类及其实例都是私有的。如果你想让它们能够被外部世界访问,你需要编写访问方法。这个方法要么是一个实例方法,或者是类方法。
有时,类需要提供不束缚于任何特定对象的方法。我们已经见过一个这样的方法。new方法创建一个新的Song对象,但是new方法本身并不与一个特定的歌曲对象相关联。
song = Song.new(...)
我们会发现类方法遍布于Ruby库中。例如,File类的对象用来表示在底层文件系统中打开的一个文件。不过,File类还提供了几个类方法来操作文件,而它们并未打开文件,因此也没有相应的File对象。如果你想要删除一个文件,你可以调用类方法File.delete,传入文件名作为参数。
File.delete("dommed.txt")
类方法和实例方法是通过它们的定义区别开来的;通过在方法名之前放置类名以及一个句点,来定义类方法
class Example def instance_method #instance method end def Example.class_method #class method end end
下一篇: .NET中文乱码的解决方法分享
推荐阅读
-
ruby 类和类方法 博客分类: ruby
-
Meta-Programming in Ruby: 动态生成class,并添加attribute和method。 博客分类: Ruby RoR Ruby
-
ActiveRecord中表关联的一个问题,belongs_to和has_many不是一一对应的情况。 博客分类: Ruby RoR ActiveRecordRailsRubySQL
-
Java中String类的方法详解 博客分类: JAVA面试题 JavaCC++C#Solaris
-
java编程思想笔记(六)接口和抽象类 博客分类: java编程思想笔记 javajavawebjava编程思想
-
RSpec笔记 - let 和 let! 博客分类: 测试Ruby on Rails RSpecRuby on Rails
-
C++和Ruby使用protobuf做Socket通信 博客分类: C++ RubyCC++C#Socket
-
使用coderay和railscasts样式进行代码高亮 博客分类: Ruby RubyCSSRailsPythonDelphi
-
Ruby导出xls和csv的utf-8问题的解决 博客分类: Ruby RubyExcel
-
C++和Ruby使用protobuf做Socket通信 博客分类: C++ RubyCC++C#Socket