instance_eval を使った DSL作成の練習 main.rb を実行すると、次のように出力される。
hoge -> B -> E
B -> D
hoge -> C
| n = Node.new("A") do | |
| name "hoge" | |
| b = Node.new("B") do | |
| add Node.new("E") | |
| add Node.new("D") | |
| end | |
| add b | |
| add Node.new("C") | |
| end | |
| puts n.to_s |
| require 'digest/md5' | |
| class Node | |
| attr_accessor :label | |
| attr_reader :neighbors | |
| def initialize(label=Digest::MD5.hexdigest(rand.to_s), &block) | |
| @neighbors = [] | |
| @label = label | |
| instance_eval(&block) if block_given? | |
| end | |
| def to_s | |
| if neighbors.length > 0 | |
| ret = "" | |
| neighbors.each do |n| | |
| ret += "#{label} -> #{n.to_s}\n" | |
| end | |
| return ret.gsub(/\n+/, "\n") | |
| else | |
| return label | |
| end | |
| end | |
| def add(node) | |
| @neighbors << node | |
| end | |
| def name(l) | |
| @label = l | |
| end | |
| end |