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是要把事情公之于众,让打电话的人知道。在这种情况下,没有这种必要。