写一个更好的开关盒功能?

Kit*_* Ho 3 ruby

我是一个Ruby新手.
我怎样才能为这个功能写得更好?我可以使用哈希表.

def readable_status(status)
  if status == "1" 
    return "go"
  end
  if status == "2"
    return "stop"
  end
  if status == "3"
    return "die"
  end
end
Run Code Online (Sandbox Code Playgroud)

pju*_*ble 8

如果您想使用哈希(根据您的问题),您可以这样做:

def readable_status(status)
   readable = { "1" => "go", "2" => "stop", "3" => "die" }
   readable[status] || "default value"
end
Run Code Online (Sandbox Code Playgroud)

  • +1.或者`readable.fetch(status,"default_value")`,对于刚接触Ruby的人来说可能更容易理解(虽然我更喜欢你的版本). (4认同)

spa*_*dev 6

怎么样

def readable_status(status)
  %w{go stop die}[status.to_i - 1]
end
Run Code Online (Sandbox Code Playgroud)


the*_*ric 5

当然,只需使用

def readable_status(status)
    m = {'1' => 'go', '2' => 'stop', '3' => 'die'}
    m[status]
end
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你可以使它成为oneliner:

...
{'1' => 'go', '2' => 'stop', '3' => 'die'}[status]
Run Code Online (Sandbox Code Playgroud)


kar*_*dog 5

我没有尝试使用Hash-es来解决这个问题,因为给出了一些欠优化的规范(意思是:在开发过程中业务改变了规范).

哈希是好的,直到你需要编写比单个值更复杂的东西.如果需要将这些单个值更改为方法,则必须重写所有内容,因为Hashes在定义哈希通过调用方法的值来获取方法的值.如果稍后方法的返回值发生变化,则不会更改哈希值.

它仍然可读英文:-)

def readable_status(status)
  case status 
    when "1" then "go" end
    when "2" then "stop" end
    when "3" then "die" end
  end
end
Run Code Online (Sandbox Code Playgroud)