7

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。

4

1 回答 1

15

当在映射中找不到键时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
}
于 2015-08-11T17:56:10.270 回答