Ruby method_missing 多参数的情况下 想循环处理

woody1983 · 2013年09月12日 · 最后由 woody1983 回复于 2013年09月12日 · 2474 次阅读
def method_missing(name, *args)
    super if !respond_to?(name)
    puts ">>> #{name}, args: #{args}, args class: #{args.class} and size: #{args.size}"

    args.each do |pc_id|
      info = @data_source.send "get_#{name}_info", pc_id
      price = @data_source.send "get_#{name}_price", pc_id
      result = "#{name.capitalize}: #{info}, ($#{price})"
      return result = "Pc#{pc} : * #{result}" if price > 1000
      result
    end
end

测试代码

require File.dirname(__FILE__) + '/Datasource'
require File.dirname(__FILE__) + '/Computer'

ds = Datasource.new
cmp = Computer.new(ds)

puts cmp.cpu 10001
puts cmp.cpu 10001,10002

输出

[root@mysql-test-woody ruby]# ruby main.rb
>>> cpu, args: [10001], args class: Array and size: 1
Pc10001 : * Cpu: i7, ($1700)
>>> cpu, args: [10001, 10002], args class: Array and size: 2
Pc10001 : * Cpu: i7, ($1700)

我是看《Ruby 元编程》中的第二天的例子来做的 自己试着做了一个 Datasource 的类 貌似能用 动态分发的例子已经做完了 我在 GhostMethod 中 加了一些想法进去 比如 Pc 的 ID 是可以作为参数 直接赋值 甚至可以多赋值几个 循环查询并显出出来

现在处理 method_missing 的时候 貌似没有循环

我 Code 放在 Github上了 有 2 个 Branch 出问题的这个在第二个 但 Datasource 的类 都是一样的

return result = "Pc#{pc} : * #{result}" if price > 1000 被你自己 return 掉了

弱爆了~ 继续修习!

each 每次执行完都给我来个总结回报,换inject 清爽多了~ 谢谢了 各位

args.inject(0) do |result,pc_id|
  info = @data_source.send "get_#{name}_info", pc_id
  price = @data_source.send "get_#{name}_price", pc_id
  result = "#{name.capitalize}: #{info}, ($#{price})"
  result = "* #{result}" if price > 1700
  puts result
end
需要 登录 后方可回复, 如果你还没有账号请 注册新账号