为什么Sass`map-get()`没有为不存在的键返回错误?

时间:2015-08-11 15:03:12

标签: sass node-sass

当提供的地图中不存在密钥时,为什么map-get()不会抛出错误?

例如:

$map: (
  'keyone': 'value',
  'keytwo': 'value',
  'keythree': 'value'
);

map-get($map, 'keyfour');

我知道map-has-key()并且我明白这可能会有用,但如果我想顺利使用map-get(),我不应该每个都调用map-has-key()每一次。我希望map-get()抛出一个错误,但它会无声地失败。为什么这不是Sass的内容?

如果重要,我正在使用node-sass 3.2.0。

1 个答案:

答案 0 :(得分:11)

map-get()返回null而不是在映射中找不到键时抛出错误的行为是设计使然。来自Sass的维护者(为什么nth()在请求缺少元素时抛出错误但map-get()没有):

  

通常,在代码出错时尽早抛出错误是件好事。超出范围的列表访问很可能是偶然的和不正确的;相比之下,地图中缺少的关键字更有可能是有目的的。

通过https://github.com/sass/sass/issues/1721

我碰巧不同意nex3(map-get() 应该抛出错误,或者至少抛出一个可以被抑制的警告)。您可以通过编写自己的自定义map-get函数来获得所需的行为:

@function map-get-strict($map, $key) {
    @if map-has-key($map, $key) {
        @return map-get($map, $key);
    } @else {
        @error "ERROR: Specified index does not exist in the mapping";
    }   
}

$map:
  ( one: 1
  , two: 2
  );

.foo {
  test1: map-get-strict($map, one); // returns the expected value of `1`
  test2: map-get-strict($map, three); // raises an error
}