为啥 Sass `map-get()` 不为不存在的键返回错误?

Posted

技术标签:

【中文标题】为啥 Sass `map-get()` 不为不存在的键返回错误?【英文标题】:Why doesn't Sass `map-get()` return an error for a non-existent key?为什么 Sass `map-get()` 不为不存在的键返回错误? 【发布时间】:2015-11-03 21:25:48 【问题描述】:

为什么在提供的映射中不存在键时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】:

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

【讨论】:

不错。该错误不会显示您出错的地方。这也可能吗? 例如哪个文件名 只是为了完成,@error 默认情况下应该已经提供了该信息:sass-lang.com/documentation/at-rules/error

以上是关于为啥 Sass `map-get()` 不为不存在的键返回错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥打字稿将联合中的属性标记为不存在?

Sass 映射函数

Sass Maps的函数

js 怎么判断a标签的href为不为空或者 为不为# 给出提示框 转页面

如果格兰杰检验 检验结果为不为因果关系,是不是另需要进行VAR检验来继续检验两者之间的关系

为啥将数组拆箱为不正确的类型不会在 C# 中引发异常? [复制]