十一 17
2008年十一月17日,星期一,上午 7:07 | 分类:
RailsNote |
给我留言 |
class, module, def 标志着切换到新的 self, main 是默认的 self 对象用来引用自己的专门术语。self 作为消息默认的接受者,如果消息接受者是 self ,可以省略接受者和圆点。 如果存在同名的方法名和变量,而且你使用裸词标识符,那么变量具有优先权。要强制 Ruby 将标识符当作方法名,你必须使用 self.talk 或者用参数列表为空的 talk() 来调用方法。 有一个场合,即使是发送消息给当前的 self,也必须使用完整的“对象 圆点 消息”记法,那就是在调用写方法的时候。因为 Ruby 总之将序列“裸词=值”解释为对局部变量的赋值。为了调用当前对象的 venue= 方法,必须显示的给出 self。 private 和 protected 的区别 私有方法意味着该方法不能使用显式的接收者来调用。Ruby 认为你想要发送消息给当前对象 self。所以仅当 self 是一个可以响应消息的对象时,该消息才有对象接收。那啥时候 self 才会是类的实例呢?当执行类的任何一个实例方法时。所以看如下代码 class Baker def bake_cake @batter = [] pour_flour add_egg return Cake.new end def pour_flour @batter.push(Flour.new) end [...]
(阅读更多精彩内容...)
十一 16
2008年十一月16日,星期日,上午 9:09 | 分类:
RailsNote |
给我留言 |
模块没有实例,模块被混含在类中。这样类的实例可以调用定义在模块中的实例方法。混含操作由 include 语句实现。require 或 load 时,加载的内容放在引号里。但是使用 include 时,不使用引号。 module Stacklike attr_reader :stack def initialize @stack = Array.new end def add_to_stack(obj) @stack.push(obj) end def take_from_stack @stack.pop end end require “stacklike” class CargoHold include Stacklike def load_and_report(obj) pust obj.object_id add_to_stack(obj) end def unload take_from_stack end end 使用名称作为类名,使用形容词作为模块的名。上面的例子演示了如何进一步发挥模块的作用。 当给对象发送它不理解的消息的时候,会触发内建方法 method_missing 调用。 class Bicycle attr_reader :gears, :wheels, :seats def [...]
(阅读更多精彩内容...)
十一 16
2008年十一月16日,星期日,上午 5:05 | 分类:
RailsNote |
给我留言 |
实例变量使得单个对象可以记忆状态。实例变量的名字以@开头。实例变量仅仅对于它所属的对象来说是可见的。在一个特定类的某一方法中初始化的实例变量,与同一个类的其他方法定义中引用的同名实例变量是同一个。 class c def inst_var_init(value) puts “Setting an instance variable…” @ivar = value end def inst_var_report puts “Inspection the value of the instance variable…” puts @ivar end end 初始化对象状态 class c def initialize(venue, date) @venue = venue @date = date end def venue @venue end def date @date end end =号方法和语法糖衣,Ruby允许定义以等号结束的方法。另外当解释器看到一个裸词后面有等号的时候。它会自动忽略等号前面的空格。从而得到一条单独的消息,例如 price= 。 class Ticket [...]
(阅读更多精彩内容...)
十一 10
2008年十一月10日,星期一,上午 7:07 | 分类:
RailsNote |
给我留言 |
def all @order = params[:order] || “number” sort_proc = case @order when “author” then lambda {|r| [r.user.name.downcase, r.number]} when “status”, “title”, then lambda {|r| [r.send(@order).downcase, r.number]} when “number” then lambda {|r| -r.number} end @rcrs = Rcr.find(:all).sort_by &sort_proc end 下面是一个 respond_to? 和 send 方法的例子 request = gets.chomp if ticket.respond_to?(request) puts ticket.send(request) else puts “No such information [...]
(阅读更多精彩内容...)