如何重构在同一对象上调用多个方法的代码?

时间:2011-04-01 15:14:57

标签: ruby

我有这样的代码:

 context = area.window.create_cairo_context

 context.set_source_rgb(0, 0, 0)
 context.set_line_width(0.5)
 context.arc(x + width - radius, y + radius, radius, -90 * degrees, 0 * degrees)
 context.arc(x + width - radius, y + height - radius, radius, 0 * degrees, 90 * degrees)
 context.arc(x + radius, y + height - radius, radius, 90 * degrees, 180 * degrees)
 context.arc(x + radius, y + radius, radius, 180 * degrees, 270 * degrees)
 context.close_path
 context.stroke_preserve
 context.set_source_rgb(0.7, 1.0, 1.0)
 context.fill

请注意,我一遍又一遍地在同一个对象上调用方法。有没有什么事情,Ruby会让我将当前对象(self)更改为上下文,所以我可以继续调用这些方法而不使用显式接收器,直到我更改范围?

或者,简单地说:必须有一些方法可以不必一次又一次地输入上下文!

2 个答案:

答案 0 :(得分:3)

为什么不直接实施method chaining?从每个方法调用中返回自己,以便您可以执行以下操作:

context.set_source_rgb(0, 0, 0)
       .set_line_width(0.5)
       .arc(x + radius, y + radius, radius, 180 * degrees, 270 * degrees)
       .close_path.fill

答案 1 :(得分:3)

使用instance_execinstance_eval

area.window.create_cairo_context.instance_exec do
  set_source_rgb(0, 0, 0)
  set_line_width(0.5)
  arc(x + width - radius, y + radius, radius, -90 * degrees, 0 * degrees)
  arc(x + width - radius, y + height - radius, radius, 0 * degrees, 90 * degrees)
  arc(x + radius, y + height - radius, radius, 90 * degrees, 180 * degrees)
  arc(x + radius, y + radius, radius, 180 * degrees, 270 * degrees)
  close_path
  stroke_preserve
  set_source_rgb(0.7, 1.0, 1.0)
  fill
end

请注意:您可以省略参数周围的括号。这使得它看起来更像是一个配置设置而不是编写代码。 Ruby on Rails的人,我不是其中之一,似乎非常喜欢这种方式。

area.window.create_cairo_context.instance_exec do
  set_source_rgb  0,   0,   0
  set_line_width  0.5
  arc           x+width-radius, y+radius,        radius, -90*degrees, 0*degrees
  arc           x+width-radius, y+height-radius, radius, 0*degrees,   90*degrees
  arc           x+radius,       y+height-radius, radius, 90*degrees,  180*degrees
  arc           x+radius,       y+radius,        radius, 180*degrees, 270*degrees
  close_path
  stroke_preserve
  set_source_rgb  0.7, 1.0, 1.0
  fill
end