【发布时间】:2020-10-20 11:20:08
【问题描述】:
对于一个项目,我正在创建一个类driver%,它应该是提供相同过程的不同模块的抽象层。该类将使用指定要使用的模块的参数进行初始化。
此外,我希望driver% 公开相同的过程但没有副作用,以方便使用驱动程序的单元测试类。
考虑以下几点:
module_one.rkt
#lang racket
(provide foo)
(define (foo)
(display "called from "module one"))
module_two.rkt
#lang racket
(provide foo)
(define (foo)
(display "called from "module two"))
driver.rkt
#lang racket
(require (prefix-in one: "module_one.rkt")
(prefix-in two: "module_two.rkt"))
(provide driver%)
(define driver%
(class object%
(super-new)
(init driver-choice)
(define choice driver-choice)
(define/public (foo)
(case choice
[(1) (one:foo)]
[(2) (two:foo)]
[else void]))))
这满足了上述要求,但不是很优雅:对于每个公开的过程,都必须添加另一个 case 表达式。这似乎没有必要,因为 API 的选择是在类被实例化时做出的,所以任何地方的选择都是一样的。
对于这个问题,更可接受的解决方案是什么?我已经研究过使用local-require,但这似乎不适用于define/public。
非常感谢!
【问题讨论】:
标签: racket