Ruby之类变量和类方法

类变量被类的所有对象所共享,它与类方法相关联。对一个给定的类来说,类变量只存在一份拷贝。类变量由两个@符号开头,例如@@count。与全局变量和实例变量不同,类变量在使用之前必须被初始化。通常,初始化就算在类定义中的简单赋值。
例如,我们的点唱机可能希望记录每首歌被播放的次数。这个书目肯呢改是Song对象的一个实例变量。当一首歌被播放时,实例中的值增加。但是,加入我们还想要交接下共播放了多少首歌,通过搜索所有Song对象并累加它们的播放次数,或者冒天下之大不韪使用全局变量来完成统计;或者,让我们使用类变量。

class Song
    @@plays = 0
    def initialize(name, artist, duration)
        @name = name
        @artist = artist
        @duration = duration
        @plays = 0
    end

    def play
        @plays+=1
        @@plays+=1
        puts "the song plays for #@plays time.  and Total plays #@@plays time."
    end
end

出于调试的目的,我们还让Song#play 返回一个字符串,其中包括该歌曲被播放的次数,以及所有歌曲播放的总次数。我们可以很容易测试它。

s = Song.new(‘vista‘, ‘ultimate‘, 123)
p = Song.new(‘vitas‘, ‘thestars‘, 325)
s.play           -> the song plays for 1 time.  and Total plays 1 time.
p.play           -> the song plays for 1 time.  and Total plays 2 time.
p.play           -> the song plays for 2 time.  and Total plays 3 time.
p.play           -> the song plays for 3 time.  and Total plays 4 time.
s.play           -> the song plays for 2 time.  and Total plays 5 time.

类变量对类及其实例都是私有的。如果你想让它们能够被外部世界访问,你需要编写访问方法。这个方法要么是一个实例方法,或者是类方法。

有时,类需要提供不束缚于任何特定对象的方法。我们已经见过一个这样的方法。new方法创建一个新的Song对象,但是new方法本身并不与一个特定的歌曲对象相关联。

song = Song.new(...)

我们会发现类方法遍布于Ruby库中。例如,File类的对象用来表示在底层文件系统中打开的一个文件。不过,File类还提供了几个类方法来操作文件, 而它们并未打开文件,因此也没有相应的File对象。如果你想要删除一个文件,你可以调用类方法File.delete,传入文件名作为参数。

File.delete("doc.txt")

类方法和实例方法是通过它们的定义区别开来的;通过在方法名之前放置类名以及一个句点,来定义类方法

class Example
    def instance_method            #instance method
    end

    def Example.class_method       #class method
    end
end
时间: 2024-09-29 10:54:28

Ruby之类变量和类方法的相关文章

Java中的类变量、实例变量、类方法、实例方法的区别

类变量:形如static int a; 顾名思义,类变量可以理解为类的变量,类变量在类加载的时候就已经给它分配了内存空间,不同于实例变量(int a; ),实例变量是在该类创建对象的时候分配内存的.并且,每创建一个对象,就会为该实例变量分配相应的内存空间,而类变量它不属于任何一个对象,它为所有对象所共享,所有对象的类变量占用相同的一处内存空间.调用类变量过程中,可以用 类名.类变量 也可以 对象名.类变量 来调用.类变量同于C/C++中接触的static变量,有记忆功能. 类方法:static 

python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法

1. 类对象和实例对象 Python中一切皆对象,Python类本身也是一种对象,类定义完成后,会在当前作用域中定义一个以类名为名字的命名空间.类对象具有以下两种操作: 可以通过"类名()"的方式实例化一个对象. 可以通过"类名.类属性"的方式来访问一个类属性. 如果说类时一种概念性的定义,是一种类别,那么实例对象就是对这一类别的具体化.实例化,即实例化对象是类对象实例化之后的产物. class Person:# 声明一个类对象 pass p1 = Person()

模拟创建类变量,static变量加类方法,单例

@interface Model + (int) value; + (void) setValue:(int)val; @end @implementation Model static int value; + (int) value { @synchronized(self) { return value; } } + (void) setValue:(int)val { @synchronized(self) { value = val; } } @end // Foo.h @interf

ruby中实例变量、类变量等等的区别和联系

ruby的变量有局部变量,全局变量,实例变量,类变量,常量. 1.局部变量 局部变量以一个小写字母开头或下划线开头 局部变量有局部作用域限制(比如一个block内),它的作用域起始于声明处,结束于该声明所在的块.方法定义.类/模块定义的结尾.大家在写代码时经常这样写: irb(main):001:0> i=123    ---------- 这里的i就是局部变量 =>123 irb(main):002:0> s="hi"   ---------- 这里的s就是局部变量

含有$的ruby中的一些变量

ruby comes with a set of predefined variables $: = default search path (array of paths) 其他Ruby特殊变量: $! 最近一次的错误信息 [email protected] 错误产生的位置 $_ gets最近读的字符串 $. 解释器最近读的行数(line number) $& 最近一次与正则表达式匹配的字符串 $~ 作为子表达式组的最近一次匹配 $n 最近匹配的第n个子表达式(和$~[n]一样) $= 是否区

Ruby初探

官方网站:https://www.ruby-lang.org/zh_cn/ 标准库API文档:http://ruby-doc.org/stdlib-2.3.0/ 简介特性安装Ruby 命令行选项编码语法空白与行尾标识符与保留字Here DocumentBEGIN与END 语句注释运算符算数运算符比较运算符赋值运算符并行赋值位运算符范围运算符defined? 运算符点运算符 "." 和双冒号运算符 "::"运算符的优先级数据类型数值(Number)字符串(String

oc-14-对象方法调用类方法

Person.h #import <Foundation/Foundation.h> @interface Person : NSObject { @public int _age; float _weight; // 运动1次,就去吃饭. } // 让人运动 - (void)sport; // 让人吃 - (void)eat; // 让人运动 + (void)sport; // 让人吃 + (void)eat; //对象方法 - (void)study; //类方法 + (void)stud

理解Ruby中的作用域

作用域对于Ruby以及其它编程语言都是一个需要理解的至关重要的基础知识.在我刚开始学习ruby的时候遇到很多诸如变量未定义.变量没有正确赋值之类的问题,归根结底是因为自己对于ruby作用域的了解不够,但在你看看完我的这篇文章后,相信你不会再担心会遇到这些头疼的问题. 什么是作用域? 当谈论到作用域的时候,应该马上想到变量和可见性这两个词,变量和可见性是作用域的主要内容,没错,作用域就是关于在代码的什么地方什么变量是可见的,当你充分了解了作用域后,给你一段代码,你可以轻易知道此时什么变量是可见的,

类方法和实例方法区别

1.类方法和实例方法 类方法:不需要声明一个对象(实例),就可以直接引用.通常是有返回值的(否则类方法就无意义了,因为没有对象或者相应的成员变量的值可以设置) 类方法的特点: 1.声明和实现的时候,以(+)开头 2.类方法属于类的本身,只能通过类名调用 3.类方法不能直接访问成员变量 4.类方法不能直接调用对象方法(可以间接调用)    // 间接调用:1> 把对象当做形参传入    2> 在类方法中创建一个对象 例如:+ (instancetype)personWithName:(char