Builder 模式中如何带参数问题?

http://www.iteye.com/topic/370266
中写到:

2.Builder
Ruby代码

  1. # 工头
  2. class Director
  3. def build_with builder
  4. acc = ''
  5. [:header, :body, :footer].each do |m|
  6. acc += builder.__send__ m if builder.respond_to? m
  7. end
  8. acc
  9. end
    1. end
    2. # 工人
    3. class HTMLBuilder
    4. def header; 'html builder';end
    5. def body; 'html builder' ;end
    6. def footer; '' ;end
    7. end
    8. class XMLBuilder
    9. def header; '<?xml version="1.0" charset="utf-8">';end
    10. def body; 'xml builder' ;end
    11. end
    12. d = Director.new
    13. puts(d.build_with HTMLBuilder.new)
    14. puts(d.build_with XMLBuilder.new)

这个模式中,我要给header(), body() 带参数怎么写Director类?
[b]问题补充:[/b]

def build_with buildercolor=red [/color]

acc = ''

[:header, :body, :footer].each do |m|

acc += builder.__send__ m,*args if builder.respond_to? m

end

acc

end

语法都不正确?
你跑过吗?
[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]