http://www.iteye.com/topic/370266
中写到:
2.Builder
Ruby代码
这个模式中,我要给header(), body() 带参数怎么写Director类?
[b]问题补充:[/b]
语法都不正确?
你跑过吗?
[img]/upload/attachment/112237/711aba2b-da48-3577-88d3-f926fb02600a.jpg[/img]
[b]问题补充:[/b]
您没有仔细看代码?
build_with( builder(*args) )
build_with 是方法。
builder 是一个类对象
郁闷…… 关键字…… 再改
[code="ruby"]
def build_with(builder, *args)
doe, re, me, fa, so, la, tea = args
[
builder.header(doe, re) ,
builder.body(me, fa) ,
(builder.footer(so, la, tea) rescue ''),
].join
end
[/code]
[code="ruby"]def header(*args); '
html builder';end [/code]这样就应该能为header方法添加任何参数了
然后修改下build_with builder方法
[code="ruby"]def build_with builder(*args)
acc = ''
[:header, :body, :footer].each do |m|
acc += builder.__send__ m,*args if builder.respond_to? m
end
acc
end [/code]
主要就是一块元编程的东西,加个参数应该就能跑了吧
sorry,我当时在win上面,没ruby环境,*args这个参数是可以加任意个参数的意思,语法没有错误
[code="ruby"]irb(main):005:0> def username *args
irb(main):006:1> p args.size
irb(main):007:1> end
=> nil
irb(main):008:0> username(1,2,3,4)
4
=> nil[/code]
*args是个数组
那就这样
[code="ruby"]def build_with(builder,*args)
acc = ''
[:header, :body, :footer].each do |m|
acc += builder.__send__ m,*args if builder.respond_to? m
end
acc
end [/code]
看错了,不好意思
不用拘泥于那个 each 嘛 ~
[code="ruby"]
def build_with(builder,*args)
[
builder.header('do', 're') ,
builder.body('me', 'fa') ,
(builder.footer('so','la','tea') rescue ''),
].join
end
[/code]
改一改……
[code="ruby"]
def build_with(builder, *args)
do, re, me, fa, so, la, tea = args
[
builder.header(do, re) ,
builder.body(me, fa) ,
(builder.footer(so, la, tea) rescue ''),
].join
end
[/code]