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

时间:2017-08-31 01:55:12

标签: ruby if-statement rake

我有以下逻辑来确定要执行的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吗?

3 个答案:

答案 0 :(得分:2)

使用三元运算符:

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)")

答案 1 :(得分:1)

  

if语句可能是1代码行而不是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

就我个人而言,我并不理解这种对#1所写的一切的痴迷,但是你要求它,就在这里。我根本没有发现它更具可读性。

答案 2 :(得分:0)

字符串连接绝对是一个好主意,但它对于初学者来说几乎不会产生混淆。因此,为了更好的可读性,您可以使用如下所示的字符串插值,

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

我认为你也可以将公共选项区域移到三元oprator之外,

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