Recursion 更少的递归错误-从包含命名空间调用嵌套命名空间中包含的递归mixin会产生;是未定义的“;
以下代码在通过Visual Studio 2013的Web Essentials编译时产生错误。我认为该插件使用Winless,但在其他编译器上也失败了Recursion 更少的递归错误-从包含命名空间调用嵌套命名空间中包含的递归mixin会产生;是未定义的“;,recursion,less,mixins,Recursion,Less,Mixins,以下代码在通过Visual Studio 2013的Web Essentials编译时产生错误。我认为该插件使用Winless,但在其他编译器上也失败了 .root { #namespace { .not-recursive(@x) { .margin-@{x} { margin: (1px * @x); } } .recursive(@x; @i: 0) when (@i =< @x) {
.root {
#namespace {
.not-recursive(@x) {
.margin-@{x} { margin: (1px * @x); }
}
.recursive(@x; @i: 0) when (@i =< @x) {
.not-recursive(@i);
.recursive(@x; (@i + 1) );
}
}
/* This works */
.sub-class {
#namespace > .not-recursive(99);
#namespace > .recursive(5);
}
/* Recursion fails */
#namespace > .not-recursive(100);
#namespace > .recursive(5); // Why???
}
.root{
#名称空间{
.非递归(@x){
.margin-{x}{margin:(1px*@x);}
}
.recursive(@x;@i:0)当(@i=<@x){
.不是递归的(@i);
.递归(@x;(@i+1));
}
}
/*这很有效*/
.小班{
#命名空间>。非递归(99);
#名称空间>.recursive(5);
}
/*递归失败*/
#命名空间>。非递归(100);
#名称空间>.recursive(5);//为什么???
}
如果我注释掉最后一行,加上注释为什么???
,它就会编译
如果我将#namespace
放在.root
之外,并且仍然使用#namespace>.recursive()
它会编译
如果我必须大胆猜测的话,我会猜测它正在尝试在混入中调用.root.recursive()
而不是.root\namespace.recursive()
一次,但这仅仅是一个猜测,它只是在四处玩,看看什么有效/无效
这没什么大不了的,但它确实让我很困扰,我想知道我是否遗漏了文档中的某些内容或发现了新问题。嗯,我确实认为这是一个bug。 但经过一些测试(“尝试和错误”),我找到了一个有效的解决方案:
.root {
(...)
// Problem solved.
& { #namespace > .recursive(5); }
}
我想这只是一个bug。我建议文档应该提到名称空间应该在主作用域中定义。@Bass Jobsen,不,没有这样的要求。名称空间可以在任何地方定义(例如,名称空间内的名称空间等)。从技术上讲,名称空间只是一个普通的规则集,与其他任何规则集一样,它允许无限嵌套。啊,错误本身可以简化为,因此就变成了(尽管示例有点混乱)。似乎开发人员可以通过指定要遵循的特定约定来解决这个问题(例如@BassJobsen建议)但我想他们希望在没有任何看似武断的限制的情况下支持嵌套