1

请考虑以下几点:

import options

template tpl[T](a: untyped) : Option[T] =
  var b {.inject.}: T = 4
  a
  none(int)

discard
  tpl[int]:
    echo b

这将构建并运行并产生输出:

4

但是,如果你删除{.inject.}编译指示,你会得到:

...模板/通用实例从这里
错误:未声明的标识符:'b'

我不认为我们可以考虑echo b模板“内部”之外的代码块,因为:它仅用于模板扩展,并且:它作为参数传递,而不是在外部使用。

我被迫使用一些肮脏的东西,现在我已经弄脏了我的全球范围来完成这项工作?

4

2 回答 2

3

这种工作方式是有道理的。您想明确说明用户指定的代码中可用的内容。

您可以使用以下方法保持全局范围的卫生block

import options

template tpl[T](a: untyped) : Option[T] =
  block:
    var b {.inject.}: T = 4
    a
    none(int)

discard
  tpl[int]:
    echo b
于 2018-04-01T11:24:04.760 回答
3

原因是注入的名称是模板公共接口的一部分。您不希望模板的实现细节在用户代码中泄漏并可能在那里产生命名冲突,因此默认情况下,在模板中创建的所有变量对用户代码都是隐藏的。

像这样使用inject不被认为是肮脏的,这是正确的做法。

于 2018-04-01T12:18:51.203 回答