ifvarclass => 'class'
构造与class::
构造的工作方式有什么区别吗?我可以互换使用两者吗?
问问题
93 次
1 回答
2
不完全是,但差不多。请注意,任何时候您使用类表达式 ( expression::
),上下文限制都会应用到下一个表达式或下一个 Promise 类型,因此它可能一次应用于多个 Promise,而 ifvarclass 一次仅适用于一个 Promise。此外,从 3.7.0 开始,还有一个if
别名更ifvarclass
适合键入恕我直言。
对于简单的基于类的约束是的,它们可以互换使用。
bundle agent main
{
vars:
"classes" slist => { "linux", "windows" };
reports:
"I am a Linux box"
ifvarclass => "linux";
linux::
"I am still a Linux box";
}
R: I am a Linux box
R: I am still a Linux box
您还可以互换使用简单的表达式。
bundle agent main
{
vars:
"classes" slist => { "linux", "windows" };
reports:
"I am a Linux box"
ifvarclass => "linux.64_bit";
linux.64_bit::
"I am still a Linux box";
}
R: I am a Linux box
R: I am still a Linux box
在 3.7.0 之前,您不能在传统的上下文类表达式 ( $(my_variable)::
) 中使用变量,并且ifvarclass
对于能够使用规范化变量作为约束很有用。
例如,在 3.7 之前,您必须这样做:
bundle agent main
{
vars:
"classes" slist => { "linux", "windows" };
reports:
"I am $(classes) box"
ifvarclass => "$(classes)";
}
R: I am linux box
从 3.7 开始,您可以使用变量类表达式:
bundle agent main
{
vars:
"classes" slist => { "linux", "windows" };
reports:
"$(classes)"::
"I am $(classes) box";
}
R: I am linux box
这工作正常,直到您检查的事物列表包含在类中无效的字符(如破折号)。这是ifvarclass
最有用的地方,因为它允许您即时转换字符串,甚至可以使用返回 boolean 之类的函数isvariable()
。
这是一个显示ifvarclass
与canonify()
.
bundle agent main
{
classes:
# A class that was derived from a string containing invalid characters like special-class
"special_class" expression => "any";
vars:
"classes" slist => { "linux", "windows", "special-class" };
reports:
"I am $(classes) box"
ifvarclass => canonify( $(classes) );
}
R: I am linux box
R: I am special-class box
于 2017-06-14T20:32:35.663 回答