gpt4 book ai didi

Scala DSL - 嵌套 block 引用父

转载 作者:行者123 更新时间:2023-12-01 02:28:29 24 4
gpt4 key购买 nike

在 Scala 中使用 DSL,所以可以说我有这样的东西:

house {
floor {
bedroom("kids)
bedroom("master")
}
floor {
kitchen()
}
}

现在我想要的是在每个嵌套块上都有一个引用或引用封闭块上的函数。例如,效果是将地板添加到房屋,将卧室添加到地板等。

目前,我以一种可怕的方式执行此操作,即在每个嵌套级别更新全局堆栈以跟踪当前的“上下文”。此外,我当前的版本不是类型安全的,因为我可以在房子中添加一间卧室。

另一个先前的修订是
house {
floor {
bedroom("kids) +
bedroom("master")
} +
floor {
kitchen()
}
}

每个块返回一个小部件列表(+ 使用隐式将通用“事物”转换为“事物列表”,以便可以添加下一个“事物”)。一旦块返回,就会添加返回的小部件列表。但我不喜欢强制使用 + 因为它在许多页面上变得丑陋。

无论如何要融合两者?

最佳答案

这种方法使用可变字段在创建所涉及的对象后设置子到父关系:

/* Data classes */

class House(val floors: Seq[Floor])
class Floor(val name: String, val bedrooms: Seq[Bedroom]) { var house: House = _}
class Bedroom(val name: String) { var floor: Floor = _ }

/* Factory methods */

def house(floors: Floor*) = {
val house = new House(floors)
floors foreach (_.house = house)
house
}

def floor(name: String)(bedrooms: Bedroom*) = {
val floor = new Floor(name, bedrooms)
bedrooms foreach (_.floor = floor)
floor
}

def bedroom(name: String) = new Bedroom(name)

这允许您以简洁且类型安全的方式创建房屋结构,如下所示:
val myHouse = 
house(
floor("first")(
bedroom("joe")
),
floor("second")(
bedroom("anna"),
bedroom("clara")
)
)

assert(myHouse.floors(0).house == myHouse)
assert(myHouse.floors(1).house == myHouse)
assert(myHouse.floors(0).bedrooms(0).floor == myHouse.floors(0))
assert(myHouse.floors(1).bedrooms(1).floor == myHouse.floors(1))

将常见行为分解为一​​些基本特征或方法应该相当容易,例如,迭代子组件以修复关系。

关于Scala DSL - 嵌套 block 引用父,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14607279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com