简单示例
定义类 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 | 初始化父类 |
