我有这样的代码:
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)更改为上下文,所以我可以继续调用这些方法而不使用显式接收器,直到我更改范围?
或者,简单地说:必须有一些方法可以不必一次又一次地输入上下文!
答案 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_exec
或instance_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