Ruby for Rails 最佳实践Ⅴ

第五章 用类组织对象

一、类和实例

1. 第一个类

class Ticket

end

ticket = Ticket.new

 

2. 实例方法与单例方法

(1)在类中定义、供类的所有实例使用的方法,称为实例方法(Instance methods)

class Ticket

  def event

    "Can't really be specified yet..."

  end

end

 

(2)为一个特定的对象定义的方法,称为单例方法(Singleton methods)

class Ticket

end

ticket = Ticket.new

def ticket.price

         117.50

end

 

3. 实例变量:使得单个对象可以记忆状态

class C

  def inst_var_init(value)

    puts "Setting an instance variable...."

    @ivar = value

  end

  def inst_var_report

    puts "Inspecting the value of the instance variable...."

    puts @ivar

  end

end

c = C.new

c.inst_var_init("Just some string")

c.inst_var_report

 

4. 初始化对象状态

class Ticket

         def initialize(venue,date)

                   @venue = venue

                   @date = date

         end

 

         def venue

                   @venue

         end

        

         def date

                   @date

         end

end

 

二、设置方法

(1)改变对象状态(定义方法)

class Ticket

  def initialize(venue, date)

    @venue = venue

    @date = date

  end

  def set_price(amount)

    @price = amount

  end

  def price

    @price

  end

end

 

(2)语法糖衣(Syntactic sugar)

def price=(amount)

  @price = amount

end

 

调用写方法的语法糖衣

ticket.price=(65.00)

可以这样写:

ticket.price = 65.00

 

三、属性和 attr_* 方法族

1. 产生获取和设置方法 attr_* 方法族的总结

方法名

效果

例子

等价的代码

attr_reader

产生读方法

attr_reader :venue

def venue

@venue

end

attr_writer

产生写方法

attr_writer :price

def price=(price)

@price = price

end

attr_accessor

产生读写方法

attr_accessor :price

def price=(price)

@price = price

end

def price

@price

end

attr

产生读方法和可选的写方法(如果第二个参数为 true)

1. attr :venue

2. attr :price, true

1. 参见 attr_reader

2. 参见 attr_accessor

 

2.属性访问修饰符的使用

class Ticket

         attr_accessor :venue, :date

end

 

四、类方法和 Class 类

1. 类也是对象:类是唯一具有创建新对象(实例)的能力的一类对象

下面定义一个类方法,找出最贵的入场券

def Ticket.most_expensive(*tickets)

  tickets.sort_by {|t| t.price }.last

end

 

我们可以用该方法找出哪张入场券是最贵的

th = Ticket.new("Town Hall","11/12/13")

cc = Ticket.new("Convention Center","12/13/14/")

fg = Ticket.new("Fairgrounds", "13/14/15/")

th.price = 12.55

cc.price = 10.00

fg.price = 18.00

highest = Ticket.most_expensive(th,cc,fg)

puts "The highest-priced ticket is #{highest.venue}."

 

2. 类方法的调用方式

Ticket.most_expensive 或 Ticket::most_expensive

 

五、常量

常量的名字以一个大写字母开头

class Ticket

  VENUES = ["Convention Center", "Fairgrounds", "Town Hall"]

end

puts Ticket::VENUES

 

六、继承

1. 抽象事物和特殊事物之间的关系可以通过继承(inheritance)来表达

class Publication

  attr_accessor :publisher

end

 

class Magazine < Publication

ddattr_accessor :editor

end

 

2. 继承和 Rails 设计

class ComposerController < ApplicationController

end

 

class ApplicationController < ActionController::Base

 

class Composer < ActiveRecord::Base

 

七、Object 类

Object 类位于继承树的顶部。每一个类都是 Object 的直系后代

class C

end

 

class D < C

end

 

puts D.superclass

puts D.superclass.superclass

 

输出为:

C

Object

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值