`
任清宇
  • 浏览: 21789 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 

 
 
分享到:
评论

相关推荐

    Ruby 方法、类

    在Ruby中,方法和类是构建程序的基本元素,它们是实现代码重用和组织的关键概念。 ### 方法(Methods) 方法在Ruby中是可重复使用的代码块,它们接受参数,执行特定任务,并可能返回值。方法定义使用`def`关键字...

    Ruby-Refrigerator冻结所有核心ruby类

    然而,这种灵活性也意味着在某些情况下,程序可能会无意中修改核心的Ruby类或模块,这可能导致不可预测的行为,尤其是在生产环境中。为了防止这种情况,开发者可以使用特定的工具,如"Ruby-Refrigerator"。 "Ruby-...

    类变量、全局变量、实例变量, 多态、为什么ruby、ruby编码规范

    5. 使用`snake_case`命名方法和变量,`CamelCase`命名类。 通过遵循这些规范,我们可以写出更清晰、更易于理解的Ruby代码,从而提高代码质量。 总结,理解并熟练运用Ruby中的类变量、全局变量、实例变量以及多态...

    Ruby-FinishingMoves将一些很实用的方法添加至核心Ruby类

    总结来说,`Ruby-FinishingMoves`通过向核心Ruby类添加实用方法,提升了编程体验和代码质量。这些扩展包括但不限于数组、字符串、哈希、日期时间的便捷操作,以及元编程和迭代器的优化。正确使用此类扩展,可以使...

    Ruby-Stringex一些实用的Ruby字符串扩展类

    Ruby是一种面向对象的动态...总之,Stringex是Ruby开发者的一个强大工具,它扩展了Ruby的内建字符串类,使得处理字符串变得更加简单和直观。无论你是新手还是经验丰富的开发者,都值得在你的项目中尝试和利用这个库。

    ruby实用函数和实例

    尽管没有具体说明文件内容,但通常在Ruby中处理文本文件,我们会用到File类,它提供了打开、读取、写入和关闭文件的方法。例如,`File.open('filename.txt', 'r')`可以用来读取文件,`File.write('filename.txt', '...

    Ruby-Functo是ruby中的可组合方法对象

    在传统的面向对象编程中,我们通常会定义类和实例方法来封装逻辑,而在函数式编程中,我们倾向于将函数作为一等公民,这意味着它们可以被赋值给变量、作为参数传递,也可以作为其他函数的返回值。 在Ruby中,Functo...

    Ruby面向对象编程中类的方法与类的扩展

    本文介绍了Ruby中类方法的定义方式以及如何通过类扩展和对象扩展来增强类的功能。这些强大的特性使得Ruby成为了一种非常灵活的语言,能够轻松地扩展类和对象的行为,同时保持代码的清晰和可维护性。理解这些概念对于...

    Ruby编程Ruby Programming

    - **动态性**:Ruby支持运行时修改代码结构,允许开发者在程序运行过程中改变类和方法的行为。 - **元编程能力**:Ruby提供了一种称为元编程的技术,使得程序可以自我修改和自我扩展。 ### 二、Ruby编程基础 #### ...

    Ruby类实例变量、类实例方法和类变量、类方法的区别

    在Ruby语言中,类实例变量、类实例方法与类变量和类方法是构成面向对象编程模型的重要组成部分。它们各自有不同的用途和行为特性,下面详细介绍这些概念的区别以及它们的使用场景。 首先,类实例变量和类实例方法都...

    Ruby-Ruby的面向对象的枚举

    在这里,`values` 是Ruby类的实例方法,返回类的所有常量。通过`each` 方法,我们可以轻松地遍历枚举的所有值。 面向对象的枚举还可以包含实例方法,以便提供更复杂的业务逻辑。比如,我们可以定义一个`next_day` ...

    笨方法学ruby-中文版

    书中会讲解类、对象、继承、模块(mixins)以及方法的动态性,这些都是理解Ruby编程的关键。 3. **异常处理**:Ruby中的异常处理机制允许程序在遇到错误时优雅地恢复或终止。书中会介绍如何使用begin/rescue/ensure...

    Ruby元编程 源代码 Metaprogramming Ruby source code

    `include`和`extend`关键字分别用于实例方法和类方法的混入。 6. **常量、变量和符号**:Ruby的常量、局部变量和符号在运行时也可以被查询和修改,尽管常量的修改可能会导致警告。 7. **Closures和Proc对象**:...

    ruby基础教程(第四版)第20章 Time类与Date类1

    本章节将详细讲解Ruby中的`Time`类和`Date`类,以及如何进行时间相关的操作。 首先,我们来看`Time`类。`Time`类主要用于处理带有时间戳的时间对象,它可以从系统获取当前时间,比如使用`Time.new`或`Time.now`。...

    Ruby-Referral一个命令行工具用于查找过滤和排序Ruby代码的定义和引用

    方法是类或模块中定义的行为,Referral能找出方法的调用位置和实现,这对于理解代码流程和优化性能至关重要。变量在Ruby中分为局部变量、实例变量、类变量和全局变量,Referral能够追踪它们的使用情况,有助于识别...

    Ruby元编程pdf

    Ruby元编程的核心概念包括类、模块、方法、变量和对象的动态性。以下是对这些概念的详细解释: 1. **类与模块**:在Ruby中,类和模块都是对象。你可以动态地创建和修改它们。例如,你可以通过`Class.new`创建一个新...

    Ruby-MongoMapper针对Mongo的一个Ruby对象映射器

    1. **模型定义**:你可以定义一个Ruby类并继承自`MongoMapper::Document`,然后使用`key`方法声明属性,这类似于ActiveRecord中的`attr_accessor`。例如: ```ruby class User include MongoMapper::Document ...

    06Ruby 方法.docx

    #### 类方法 在 Ruby 中,方法默认标记为私有(private),但如果方法定义在类内部,默认为公共(public)。可以通过 `public` 或 `private` 关键字改变方法的可见性。 ```ruby class Accounts def reading_charge ...

Global site tag (gtag.js) - Google Analytics