这个 IF 语句有可能是 1 行代码,而不是 5 行吗?

Is it possible for this IF statement to be 1 line of code, instead of 5?

我有以下逻辑来确定执行哪个 eval 查询..

docker_version=%x[docker version -f {{.Server.Version}}].gsub(/[^0-9,.]/, "")

if docker_version < '17.06'
  query="eval $(aws ecr get-login --region us-west-2)"
else
  query="eval $(aws ecr get-login --no-include-email --region us-west-2)"
end
sh "#{query}"

if 语句是否可以是 1 行代码而不是 5

使用三元运算符:

query = docker_version < '17.06' ?
        "eval $(aws ecr get-login --region us-west-2)" :
        "eval $(aws ecr get-login --no-include-email --region us-west-2)"

使用字符串连接我们可以进一步整理:

query = "eval $(aws ecr get-login " +
        (docker_version < '17.06' ? "--region us-west-2)" : "--no-include-email --region us-west-2)")

字符串连接绝对是个好主意,但它会造成一些混淆,尤其是对于初学者。因此,为了更好的可读性,您可以使用如下所示的字符串插值,

query = "eval $(aws ecr get-login #{docker_version < '17.06' ? '--region us-west-2' : '--no-include-email --region us-west-2'})"

我想你也可以将公共选项区域移到三元运算符之外,

query = "eval $(aws ecr get-login --region us-west-2 #{docker_version < '17.06' ? '' : '--no-include-email'})"

Is it possible for the if statement to be 1 line of code instead of 5?

Ruby 中永远不需要换行符,您可以随时删除它们:

if docker_version < '17.06' then query="eval $(aws ecr get-login --region us-west-2)" else query="eval $(aws ecr get-login --no-include-email --region us-west-2)" end

就我个人而言,我不理解这种对 "writing everything in 1 line" 的痴迷,但你要求它,它就在这里。我根本不觉得它更具可读性。