我正在嘗試撰寫一個 Ruby DSL 模塊,該模塊可用于構造帶有嵌套鍵的哈希,其語法如下:
Tree.new do
node :building do
string :name, 'Museum'
node :address do
string :street, 'Wallaby Way'
string :country, 'USA'
end
end
end.to_h
該呼叫的預期輸出將是此哈希:
{
"building": {
"name": "Museum",
"address": {
"street": "Wallaby Way",
"country": "USA"
}
}
}
我可能需要支持節點的多個深度級別,但不能完全弄清楚如何建模。
到目前為止,我已經有了這個,用空哈希初始化樹類,并評估傳遞給它的塊:
class Tree
def initialize(&block)
@tree = {}
instance_eval &block
end
def to_h
@tree
end
def node(name, &block)
@tree[name] = block.call
end
def string(name, value)
@tree[name] = value
end
end
但它給了我這個扁平的結構:
=> {:name=>"Museum", :street=>"Wallaby Way", :country=>"USA", :address=>"USA", :building=>"USA"}
我認為我嘗試在 中呼叫塊的方法是正確的node,但不能完全弄清楚如何讓每個節點將其內容應用到它的哈希部分,而不是@tree[name],這顯然是關鍵頂級哈希?
uj5u.com熱心網友回復:
呼叫 node 時需要初始化一棵新樹。
class Tree
def initialize(&block)
@tree = {}
instance_eval &block
end
def to_h
@tree
end
def node(name, &block)
@tree[name] = (Tree.new &block).to_h
end
def string(name, value)
@tree[name] = value
end
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/529720.html
標籤:红宝石
上一篇:Ruby3動態關鍵字引數
