我构建了一个参数化mixin,它根据" node-value"来查找元素的子元素。我创建的系统。会发生什么是通过循环函数找到子项" .extractArrays"与" .deliverChild"在里面。然后将子项(最多4个)放入" .calculateWidth",它返回变量中子项的宽度(例如" calculatedWidth1")。
问题是:当没有第三个和第四个孩子时,@ child3和@ child4未设置,这会产生错误。我在mixins之前将@ child3和@ child4设置为零,希望在调用mixins之前这会给它们默认值0。但是,出于某种原因,当有第三个孩子时,mixin的返回值@ child3不会覆盖设置为0的@ child3。我不确定为什么会这样,但我觉得比如在混合和范围方面有一些事情让我想起Less。
@child3: none, 0 0, 0, 0;
@child4: none, 0 0, 0, 0;
.extractArrays(@index, @node, @node-value, @elements-array) when (@index <= @length-elements-array) {
@element-array: extract(@elements-array, @index);
@found-node: extract(@element-array, 2);
.deliverChild(@element-array, @found-node) when (@found-node = @child-node-value1) {
@child1: extract(@element-array, 1);
}
.deliverChild(@element-array, @found-node) when (@found-node = @child-node-value2) {
@child2: extract(@element-array, 1);
}
.deliverChild(@element-array, @found-node) when (@found-node = @child-node-value3) {
@child3: extract(@element-array, 1);
}
.deliverChild(@element-array, @found-node) when (@found-node = @child-node-value4) {
@child4: extract(@element-array, 1);
}
.deliverChild(@element-array, @found-node);
.extractArrays(@index + 1, @node, @node-value, @elements-array);
}
.extractArrays(1, @node, @node-value, @elements-array);
.calculateWidth(@child1, 1);
.calculateWidth(@child2, 2);
.calculateWidth(@child3, 3);
width: @calculatedWidth1 + @calculatedWidth2 + @calculatedWidth3 + @calculatedWidth4;
答案 0 :(得分:0)
(不完全回答&#34;范围&#34;上面的问题,但是在上面的评论中建议的另一种方法中使用的算法作为起点):
通用数组过滤mixin看起来像这样(小于1.7.5或更高):
@array: // key value
a 1,
b 2,
c 3,
a 4,
d 5,
a 6,
c 7;
// usage:
usage {
.filter-array(@array, a);
result: @filter-array;
}
// impl.:
.filter-array(@array, @key, @key-index: 1) {
.-(length(@array));
.-(@i, @r...) when (@i > 0)
and not(@key = extract(extract(@array, @i), @key-index)) {
// skip item since key does not match
.-((@i - 1), @r);
}
.-(@i, @r...) when (length(@r) > 0)
and (@key = extract(extract(@array, @i), @key-index)) {
// key matches and @r is not empty so concat current item to @r
.-((@i - 1); extract(@array, @i), @r);
}
.-(@i, @r...) when (length(@r) = 0)
and (@key = extract(extract(@array, @i), @key-index)) {
// key matches and @r is empty so this is our first item
.-((@i - 1), extract(@array, @i));
}
.-(@i, @r...) when (@i = 0) {
// define "return" variable:
@filter-array: @r;
}
}
结果数组等于:
@filter-array:
a 1,
a 4,
a 6;
这看起来非常可怕和冗长,但仍然比原始方法更干净,更可控。
此外,提供专用的mixin以返回数组项的某些值的总和(或任何其他&#34;转换&#34;结果为单个值)是有意义的(这样的实现可以是简化到某一点,因为你不需要连接任何东西,上面的一些条件和/或mixin专业化变得不必要了。)