Ruby /厨师:IF ELSE声明

问题描述 投票:0回答:1

尝试根据{CREATE_OID_SCHEMA}是否为true将模板变量{USE_EXISTING_SCHEMA}设置为= true或false。在指定{CREATE_OID_SCHEMA}的IF条件时,我应该使用==或=吗?

case node['fmw']['shortname']
      when /oid1/
        IS_SECOND_OID_INSTALL = "false"
        CONFIGURE_OVD_COMPONENT = "true"
        CREATE_OID_SCHEMA = "true"
          if CREATE_OID_SCHEMA = "true" then
            USE_EXISTING_SCHEMA = "false"
          else USE_EXISTING_SCHEMA = "true"
      when /oid2/
        IS_SECOND_OID_INSTALL = "true"
        CONFIGURE_OVD_COMPONENT = "false"
        CREATE_OID_SCHEMA = "false"
          if CREATE_OID_SCHEMA = "true" then
            USE_EXISTING_SCHEMA = "false"
          else USE_EXISTING_SCHEMA = "true"
    end
ruby if-statement chef
1个回答
1
投票

=运算符始终是赋值运算符,即使在if语句中也是如此。因此,你的陈述

if CREATE_OID_SCHEMA = "true" then

总是将字符串"true"分配给CREATE_OID_SCHEMA常量(并在此处输出警告)。由于字符串"true"也是truethy,if语句将始终匹配。

展望未来,您可能希望更新代码,如下所示:

case node['fmw']['shortname']
when /oid1/
  is_second_oid_install = "false"
  configure_ovd_component = "true"
  create_oid_schema = "true"

  if create_oid_schema == "true"
    use_existing_schema = "false"
  else
    use_existing_schema = "true"
  end
when /oid2/
  is_second_oid_install = "true"
  configure_ovd_component = "false"
  create_oid_schema = "false"

  if create_oid_schema == "true"
    use_existing_schema = "false"
  else
    use_existing_schema = "true"
  end
end

在上面的代码中,我执行了以下更改:

  • 在if语句中,我使用比较运算符==而不是赋值运算符=
  • Ruby中的变量应始终以小写字母开头并使用snake_case。以大写字母开头的单词被认为是Ruby中的常量,只能分配一次。
  • 通常不应使用then关键字。请改用换行符。

进一步更新代码时,应使用实际布尔值(truefalse)而不是包含该单词的字符串。这样,您可以缩短比较范围,更好地反映您的意图。通常,除了falsenil之外的所有值在Ruby中都是真的(因此在if语句中匹配)。这包括所有字符串,数字,正则表达式,......

© www.soinside.com 2019 - 2024. All rights reserved.