具有条件的单行Ruby多语句

时间:2016-12-01 21:21:25

标签: ruby perl

在Ruby中编写以下代码的最简洁方法是什么?

if    ($string eq "dasff1") { print "dasff1" ;print " hoiff1" } 
elsif ($string eq "dasff2") { print "dasff2" ;print " hoiff2" } 
elsif ($string eq "dasff3") { print "dasff3" ;print " hoiff3" }  

即单个行上的多个语句符合条件。

除了

之外还有其他方法吗?
if    (string == "dasff1") 
  print "dasff1" ;print " hoiff1"
elsif (string == "dasff2") 
  print "dasff2" ;print " hoiff2"
elsif (string == "dasff3") 
  print "dasff3" ;print " hoiff3"
end  

3 个答案:

答案 0 :(得分:1)

最简洁的方法是定义一个映射表,因为你正在进行直接匹配:

remap = {
  "dasff1" => "hoiff1",
  "dasff2" => "hoiff2",
  "dasff3" => "hoiff3"
}

if (remapped = remap[string])
  puts [ string, remapped ].join(' ')
end

由于这里有一个模式,你也可以这样做:

if (string.match(/\Adasff(\d+)/)
  puts [ string, 'hoiff%s' % $1 ]
end

从样式的角度来看,尽量避免使用;将多行Ruby代码连接在一起。它会造成很多混乱。

答案 1 :(得分:1)

您可以使用:

string = "dasff1"

case string
when "dasff1" then print "dasff1"; print " hoiff1"
when "dasff2" then print "dasff2"; print " hoiff2"
when "dasff3" then print "dasff3"; print " hoiff3"
end

或者只是:

print string+" "+string.sub('das','hoi') if string=~/^dasff[1-3]$/

你不应该这样做,但是因为你要求它:

if    string == "dasff1" then print "dasff1" ; print " hoiff1"
elsif string == "dasff2" then print "dasff2" ; print " hoiff2"
elsif string == "dasff3" then print "dasff3" ; print " hoiff3"
end

答案 2 :(得分:0)

鉴于

h = { "dasff1"=>"hoiff1", "dasff2"=>"hoiff2", "dasff3"=>"hoiff3" }

使用默认值等于空字符串计算另一个哈希:

g = h.each_with_object(Hash.new('')) { |(k,v),g| g[k] = "%s %s" % [k,v] }
  #=> {"dasff1"=>"dasff1 hoiff1", "dasff2"=>"dasff2 hoiff2", "dasff3"=>"dasff3 hoiff3"} 

确认默认值:

g["cat"]
  #=> ""

然后

def pr_str(str, g)
  print g[str]
end

print "|"; pr_str("dasff1", g); print "|"
  # |dasff1 hoiff1| 
print "|"; pr_str("dasff2", g); print "|"
  # |dasff2 hoiff2|
print "|"; pr_str("dasff3", g); print "|"
  # |dasff3 hoiff3|
print "|"; pr_str("catsup", g); print "|"
  # ||

打印|个字符以标记返回的每个字符串的开头和结尾。请注意print ''(与puts ''相对)不执行任何操作。