这是一个语法错误。对象包含字段,而不是表达式。您不能只将 aif
直接放在对象文字中(这甚至意味着什么?)。
不过,您可以这样做:
{
// Please note, that even if enable = false, the field is still present, but its value is null.
'hello': if self._config.hello.enable then 'world',
} + {
_config+:: {
hello: {
enable: true
},
}
}
$的含义
我认为可能对$
. 它不是指整个文件的结果,而是指词汇上最外层的对象。
例如:
local a = {
x: "a",
y: $.x
};
local b = {
x: "b",
y: $.x
};
{
a: a,
b: b,
}
结果是:
{
"a": {
"x": "a",
"y": "a"
},
"b": {
"x": "b",
"y": "b"
}
}
因此,基本上就像每次代码中的花括号不在另一对花括号内时,它都会像这样包裹它local $ = { ... }; $
(模$
不是通常有效的标识符,并且在理解的行为上略有不同)。
删除/隐藏字段
字段集及其可见性是在创建对象时确定的,因此您不能创建一个字段的存在(或可见性)取决于其他字段的对象。你可以做一些其他的事情来达到类似的效果,但enabled
不能是一部分或依赖于要创建的对象,因为那将是循环的。
您可以做的一件事是修改对象以隐藏字段,例如:
local enabled = true;
{hello: "world"} +
(if enabled then {} else {hello:: super.hello})
或者,您还可以根据对象之外的其他一些值使字段的存在成为条件:
local enabled = true; { [if enabled then "hello"]: "world" }
请注意,在这种情况下,该字段将根本不存在 - 这与仅隐藏它不同。当它被隐藏时,它不会被打印,对于相等性检查等都没有关系,但它仍然存在。当它不存在时,好吧,它根本不存在。
一种特殊情况是将您的对象包装在一个函数中,该函数采用配置而不是将其作为对象的一部分。
local makeMyObject(config) = {
[if config.enabled then "hello"]:
}
另一种方法是拥有一个包含目标对象和配置的包装器对象:
local wrapper = {
myObject: {
// Note that self in field name expressions refers to the outer object (wrapper)
// This makes sense, because they're evaluated before myObject is created.
[if self.config.enabled then "hello"]: "world",
},
config: {
enabled: true
}
}; wrapper.myObject