简单示例
实例变量
标准方法
对象和属性
只读属性
可写的属性
类变量
类方法
类常量
访问控制
方法的更多细节
古怪的后缀
常用示例
保证任何时候只有一个对象被创建
总结

简单示例

定义类 Song ,并定义 initialize 方法,这是一个特殊的方法,调用 Song.new 创建对象时,此方法会被传递给new的参数并调用:

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

实例变量

由 @ 符号开头,

标准方法

inspect 默认将对象的 ID 和实例变量格式化
to_s 比 inspect 好点
irb#1(main):030:0> song = Song.new("Bicyclops","fleck",260)
=> #<Song:0xb77023dc @duration=260, @name="Bicyclops", @artist="fleck">
irb#1(main):031:0> song.to_s
=> "#<Song:0xb77023dc>"
irb#1(main):032:0> song.inspect
=> "#<Song:0xb77023dc @duration=260, @name=\"Bicyclops\", @artist=\"fleck\">"

对象和属性

只读属性

原理实现

定义 Song 类的三个属性: name,artist,duration

class Song
  def name
    @name
  end
  def artist
    @artist
  end
  def duration
    @duration
  end
end

使用属性:

song = Song.new("Bicyclops","Fleck",260)
song.artist
song.name
song.duration

attr_reader 方法

class Song
  attr_reader :name, :artist, :duration
end

现在 Song 类已经有三个属性了: name,artist,duration,访问它们都是一样的 方式。

构成体 ":name" 是一个表达式,它返回对于 "name" 的一个 Symbol 对象。可以 将 ":name" 看作变亮 "name" 的名字,而普通的 "name" 是变量的值。

可写的属性

原理实现

定义一个以等号结尾的方法名,即可以使其出现在赋值操作左侧。

class Song
  def duration=(new_duration)
    @duration = new_duration
  end
end

attr_writer

同样可以用 attr_* 类方法实现:

class Song
  attr_writer :duration
end

类变量

类变量被类的所有对象所共享:

class Song
  @@plays = 0
end

类方法

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

class Example
  def instance_method         # 实例方法
  end
  def Example.class_method    # 类方法
  end
end

类常量

常量都要大写

class SongList
  MAX_TIME = 5*60
end

访问控制

class Accounts
  def initialize(checking,savings)
    @checking = checking
    @savings = savings
  end

  private
  def debit(account,amount)
    account.balance -= amount
  end
  def credit(account,amount)
    account.balance += amount
  end

  public
  def transfer_to_savings(amount)
    debit(@checking,amount)
    credit(@savings,amount)
  end
end

对象控制还可以类似这样定义:

public :method1, :method4
protected :method2
private :method3

方法的更多细节

古怪的后缀

? 通常用做查询片断的方法名后缀
! 危险的方法(比如 chop 返回修改的值,chop! 就地修改)
= 可以赋值的方法

常用示例

保证任何时候只有一个对象被创建

class MyLogger
  private_class_method :new
  @@logger = nil
  def MyLogger.create
    @@logger = new unless @@logger
    @@logger
  end
end

总结

supper 初始化父类