Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates 为什么即使对于模板内的代码,脏注入也是必要的';什么范围? 请考虑以下事项: import options template tpl[T](a: untyped) : Option[T] = var b {.inject.}: T = 4 a none(int) discard tpl[int]: echo b_Templates_Nim Lang_Hygiene - Fatal编程技术网

Templates 为什么即使对于模板内的代码,脏注入也是必要的';什么范围? 请考虑以下事项: import options template tpl[T](a: untyped) : Option[T] = var b {.inject.}: T = 4 a none(int) discard tpl[int]: echo b

Templates 为什么即使对于模板内的代码,脏注入也是必要的';什么范围? 请考虑以下事项: import options template tpl[T](a: untyped) : Option[T] = var b {.inject.}: T = 4 a none(int) discard tpl[int]: echo b,templates,nim-lang,hygiene,Templates,Nim Lang,Hygiene,这将生成和运行并产生输出: 四, 但是,如果删除{.inject.}pragma,则会得到: …从此处开始的模板/通用实例化 错误:未声明的标识符:“b” P> >我不认为我们可以考虑到模板的“内部”之外的代码“代码> EnguleBase/COD>”:因为它只用于模板的扩展,并且作为一个参数传递,而不是在外部使用。 我被迫使用一些肮脏的东西,现在我已经弄脏了我的全球范围,使这项工作正常进行?这项工作的方式是有意义的。您希望明确说明用户指定的代码中的可用内容 通过使用块,您可以保持全局范围的卫

这将生成和运行并产生输出:

四,

但是,如果删除
{.inject.}
pragma,则会得到:

…从此处开始的模板/通用实例化
错误:未声明的标识符:“b”

<> P> >我不认为我们可以考虑到模板的“内部”之外的代码“代码> EnguleBase/COD>”:因为它只用于模板的扩展,并且作为一个参数传递,而不是在外部使用。


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

这项工作的方式是有意义的。您希望明确说明用户指定的代码中的可用内容

通过使用
,您可以保持全局范围的卫生:

import options

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

discard
  tpl[int]:
    echo b

这样做是有道理的。您希望明确说明用户指定的代码中的可用内容

通过使用
,您可以保持全局范围的卫生:

import options

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

discard
  tpl[int]:
    echo b

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


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

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


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

我不认为这样做有意义。我以为inject是要把事情公之于众,让打电话的人知道。在这种情况下,没有这样的必要。我不相信这是有道理的。我以为inject是要把事情公之于众,让打电话的人知道。在这种情况下,没有这种必要。