Ruby 101:动态编程
Ruby 101:动态编程
Written by Allen Lee
当method_missing的魔法失效时……
在上一篇文章里,我们通过重写Hash类的method_missing方法把Hash对象模拟成匿名对象,但是,这种做法有时会产生一些莫名其妙的问题,举个例子吧,假如我把process方法(完整实现参见上一篇文章的代码31)的options参数从这样:
代码 1
改成这样:
代码 2
我们将会发现,不论options参数的count取什么值,我们总是得到两本书,为什么?想想看,method_missing方法的触发条件是什么?仅当我们调用的方法不存在时,method_missing方法才有机会出场,但是,Hash类本身就有count方法:
图 1
这打破了method_missing方法的触发条件,换句话说,method_missing方法被count方法"截胡"(麻将术语)了。Hash类的count方法返回键/值对的个数,而options参数默认就有两个键/值对,如果我们没有添加额外的键/值对,count方法的返回值将会总是2,这就是为什么修改options参数之后我们总是得到两本书。那么,如何解决这个问题?
显然,method_missing方法和count方法无法同时存在,否则转发消息的逻辑总是被忽略的,但我们不能移除count方法,因为这样会导致依赖它的代码不能正常工作,在这种情况下,我们只好把转发消息的逻辑移至别处了,那么,放哪呢?还记得《Ruby 101:对象和方法》最后那个BookStore类吗?我们可以仿效它的做法,为Hash类创建一个代理类,然后把转发消息的逻辑放到代理类的method_missing方法里:
代码 3
这样就不怕count方法的干扰了:
图 2
当然,如果你想要的只是这些,那就没有必要另起炉灶了,因为使用Ruby自带的OpenStruct类也可以达到相同的效果:
图 3
但是,OpenStruct类不支持嵌套的Hash对象,你只能通过person1.address[:city]来访问下面这个对象的城市信息:
代码 4
如果你希望通过person1.address.city来访问这个对象的城市信息,要么显式地把内嵌的Hash对象创建为OpenStruct对象:
代码 5
要么扩展AnonymousObject类,使它支持嵌套的Hash对象,如果你有兴趣的话,不妨把握这个机会练习一下吧!
消息代理
既然我们可以通过代理类截获并转发消息,何不在此基础上加点想象力?假设我有这样一个类:
代码 6
我想在调用method1方法之前做一些事情,在调用method2�
相关文档:
两种不同的语言,不同的表达!
Python脚本实现.
""
"
File Name : clean.py
File Date : 2009/11/5 14:22:56
Author : DannyLai
Purpose : Cle ......
过程如下:
1、ruby下载一键安装:
http://rubyforge.org/frs/download.php/29263/ruby186-26.exe
ruby -v 显示版本,安装成功
2、下载rubygems安装:
http://rubyforge.org/frs/download.php/60719/rubygems-1.3.5.zip
解压,ruby setup.rb
gem -v 显示版本,安装成功
3、下载rails的 gem 安装(gem install ......
client.rb
======================================================================
require 'drb'
SERVER_IP = 'druby://127.0.0.1:6666'
CLIENT_IP = 'druby://10.10.10.102:7777'
c_path = 'd:/test/'
class Client
def initialize(path)
Dir.chdir(path)
end
def mk ......
订单处置,首先要有一个订单的详细列表(包括数量,价钱啥的)和一个对于个人的一些信息的一个表。因而我们创造两个模型,line_item(列表项),order(列表),其后编者如次
/db/migrate xxx_create_order xxx_line_item
Ruby代码
一.class CreateOrders < ActiveRecord::Migration
二.def self.up
3. create_tabl ......