前記事の Ruby/GTK+ 用のモジュールを使って、ヒルベルト曲線を描いてみました。Ruby/Tk 版(参照)と殆ど同じです。
require './mygtk' class Draw def initialize(n, slot) @lgth = Width / 2 ** n @y = (Width - @lgth * (2 ** n - 1)) / 2 #見栄えを整えているだけで、特に意味のない計算 @x = Width - @y @oldx, @oldy = @x, @y @slot = slot end def ldr(n) return if n == 0 dlu(n - 1); @x -= @lgth; dline ldr(n - 1); @y += @lgth; dline ldr(n - 1); @x += @lgth; dline urd(n - 1) end def urd(n) return if n == 0 rul(n - 1); @y -= @lgth; dline urd(n - 1); @x += @lgth; dline urd(n - 1); @y += @lgth; dline ldr(n - 1) end def rul(n) return if n == 0 urd(n - 1); @x += @lgth; dline rul(n - 1); @y -= @lgth; dline rul(n - 1); @x -= @lgth; dline dlu(n - 1) end def dlu(n) return if n == 0 ldr(n - 1); @y += @lgth; dline dlu(n - 1); @x -= @lgth; dline dlu(n - 1); @y -= @lgth; dline rul(n - 1) end def dline firebrick = @slot.color(45568, 8704, 8404) @slot.line(@oldx, @oldy, @x, @y, firebrick) @oldx, @oldy = @x, @y end end Width = 400 MyGtk.app width: Width, height: Width, title: "Hilbert curve" do draw do ghostwhite = color(63488, 63488, 65535) rectangle(true, 0, 0, Width, Width, ghostwhite) n = (ARGV[0] || 5).to_i #次数を引数に。デフォルトは5次 exit if n < 1 Draw.new(n, self).ldr(n) end end
MyGtk.app のブロックの外へメソッドを持ち出したければ、self を持ち出してインスタンスにすれば可能です。Drawクラスでは @slot にブロック内の self が入っています。