2

ifvarclass => 'class'构造与class::构造的工作方式有什么区别吗?我可以互换使用两者吗?

4

1 回答 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()

这是一个显示ifvarclasscanonify().

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 回答