Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/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
Loops 较少混合中的递归循环:为什么计数器减量有效,而增量无效?_Loops_Recursion_Less_Mixins - Fatal编程技术网

Loops 较少混合中的递归循环:为什么计数器减量有效,而增量无效?

Loops 较少混合中的递归循环:为什么计数器减量有效,而增量无效?,loops,recursion,less,mixins,Loops,Recursion,Less,Mixins,作为一个新手,我对解析器在特定代码段上的行为感到困惑 我正在学习一门课程,该课程教我在LESS文件中输入此代码并对其进行解析: .lusGuardedMixin (@index) when (@index > 0) { @waarde: -((38*@index)-38); .m_item@{index} { background-position: ~"@{waarde}px" 0; &:hover {

作为一个新手,我对解析器在特定代码段上的行为感到困惑

我正在学习一门课程,该课程教我在LESS文件中输入此代码并对其进行解析:

.lusGuardedMixin (@index) when (@index > 0) {
    @waarde: -((38*@index)-38);

    .m_item@{index} {
        background-position: ~"@{waarde}px" 0;

        &:hover {
            background-position: ~"@{waarde}px" -39px;
        }

        & span {
            .menuspan(~"bgcolor_@{index}", ~"color_@{index}", ~"tshadow_@{index}")
        }
    }
    .lusGuardedMixin(@index + 1);

}
.lusGuardedMixin(6) {}
.lusGuardedMixin(1);
您可以忽略“.menuspan”-部分,它指的是一段与此处无关的代码

现在,在WinLESS中运行此代码时,它会创建一个解析器错误:“SYNTAR error:undefined”,然后引用我声明的行:

.lusGuardedMixin(1);
我尝试了各种方法,比如更改起始编号,但记住了较少的文档(及其递归示例),我最终将部分代码更改为:

[...]
     .lusGuardedMixin(@index - 1);

}
.lusGuardedMixin(0) // this is no longer explicitly necessary due to the restriction "> 0", but is still here for reference of changes I did try
.lusGuardedMixin(5);
现在它工作了!但我不知道为什么是什么导致增量(@index+1)失败,而减量(@index-1)在这段代码中起作用?

注意:我还使用原始计数器增量解决了这个问题,将(@index>0)时的原始循环条件
替换为(@index>0)时的
和(@index<6)
,但我仍然不明白为什么原始示例不起作用


提前感谢您的帮助:)

这只是因为当(@index>0)
与guard混合时,您有了
。因此,当你增加索引时,循环永远不会结束。(请注意,
.lusguaredmixin(6){}
定义无法停止循环,它在
index=6
时被调用,但默认的mixin定义也被调用,因此循环继续)。您只需在(@index<6)
时将保护更改为
(您根本不需要
(@index>0)
,因为您从
1
开始)。事实上,真正的问题是“为什么您认为您的原始示例应该工作?”:)以防万一,在循环[1]旁边的这段代码中有很多常见的陷阱。不要使用变量名串联来模拟列表/数组-而是使用本机较少的列表(请参阅)。[2]. 不要使用字符串连接将一个单位附加到一个数字上(应该使用
unit
函数,但是对于特定的示例,您甚至不需要
unit
,只需在
@waarde:-(38px*@index-38);
)中设置该单位。然后返回循环:请参阅(基本上与just中的第一个示例相同,有更多注释)了解如何使循环向前工作,同时仍然使用减少的索引(这样实现比“增加的索引”更紧凑,因为不必同时指定开始和结束索引)。当你不需要循环本身中的最后一个索引/n-of-iterations值时,它很有用。感谢你的回答:)好吧,我认为它会起作用的原因,除了我的一些保留意见外,是a)我不知道关于Less的任何具体内容,b)这个例子来自一门专门教授Less的课程。考虑到你的答案(并且考虑到我已经不得不改变2件事情,除了这个问题本身造成了错误),我猜这门课程有点糟糕:p>这门课程有点糟糕-我也在想这样说,但公平地说,它实际上可能太过时了(确实是“字符串插值/串联”方法是几年前完成任务的唯一方法。而适当的“本机列表”支持在大约半年前才出现:即
length
函数(如果没有它,则无法循环浏览列表)。