2014-10-18 34 views
1

下面的代码会产生一个错误,当通过Web要点为Visual Studio 2013年编译我认为插件使用的胜绩,但它已经失败了其他编译器也是如此。少递归错误 - 调用由含命名空间嵌套命名空间包含递归混入生产“未定义”

.root { 

    #namespace { 

     .not-recursive(@x) { 
      [email protected]{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??? 

} 

如果我注释掉最后一行,并且注释Why???它编译。

如果我将#namespace放在.root之外,仍然使用#namespace > .recursive()它编译。

如果我不得不冒险一个猜测,我猜测它试图在mixin中调用.root .recursive()而不是.root #namespace .recursive(),但这仅仅是基于四处游戏并且看到什么有效/无效的猜测。

这不是什么大不了的事情,但它真的困扰我,我想知道我是否错过了文档中的某些内容或发现了一个新问题。

+1

我想这只是一个错误。 – 2014-10-18 08:39:54

+0

我建议文档应该提及名称空间应该在主要作用域中定义。 – 2014-10-18 12:05:33

+0

@Bass Jobsen嗯,没有这样的要求。命名空间可以在任何地方定义(例如命名空间等命名空间)。从技术上讲,命名空间只是简单的规则集,并且与任何其他规则集一样,它允许无限嵌套。 – 2014-10-18 12:47:29

回答

3

嗯,我认为这是一个错误。 但经过一些测试(“试验和错误”),我发现一个工作解决方案:

.root { 
    (...) 
    // Problem solved. 
    & { #namespace > .recursive(5); } 
} 
+1

非常流畅。你欺骗了编译器。 – 2014-10-20 08:25:41