我们在这篇文章中为大家介绍的是有关Ruby case when表达式的一些基本使用技巧。比如是否能够在Groovy中得到支持等。

Ruby语言中存在着许多表达式,这些表达式用法不尽相同,实现的功能也不同。熟练的掌握这些表达式的用法,可以有助于我们编程的方便性。今天看到有人在Groovy的邮件列表上问Groovy能不能支持Ruby case when表达式:#t#

Ruby case when表达式实际应用解析  when表达式 第1张

Ruby case when表达式代码示例:

  1. car="Patriot"
  2. manufacturer=casecar
  3. when"Focus":"Ford"
  4. when"Navigator":"Lincoln"
  5. when"Camry":"Toyota"
  6. when"Civic":"Honda"
  7. when"Patriot":"Jeep"
  8. when"Jetta":"VW"
  9. when"Ceyene":"Porsche"
  10. when"Outback":"Subaru"
  11. when"520i":"BMW"
  12. when"Tundra":"Nissan"
  13. else"Unknown"
  14. end
  15. puts"The"+car+"ismadeby
    "+manufacturer
  16. car="Patriot"
  17. manufacturer=casecar
  18. when"Focus":"Ford"
  19. when"Navigator":"Lincoln"
  20. when"Camry":"Toyota"
  21. when"Civic":"Honda"
  22. when"Patriot":"Jeep"
  23. when"Jetta":"VW"
  24. when"Ceyene":"Porsche"
  25. when"Outback":"Subaru"
  26. when"520i":"BMW"
  27. when"Tundra":"Nissan"
  28. else"Unknown"
  29. end
  30. puts"The"+car+"ismadeby
    "+manufacturer

然后Guillaume给出了这么一段Ruby case when表达式代码:

  1. defcar="Patriot"
  2. defmanufacturer=match(car){
  3. when"Focus","Ford"
  4. when"Navigator","Lincoln"
  5. when"Camry","Toyota"
  6. when"Civic","Honda"
  7. when"Patriot","Jeep"
  8. when"Jetta","VW"
  9. when"Ceyene","Porsche"
  10. when"Outback","Subaru"
  11. when"520i","BMW"
  12. when"Tundra","Nissan"
  13. otherwise"Unknown"
  14. }
  15. println"The$carismadeby
    $manufacturer"
  16. defmatch(obj,closure){
  17. closure.subject=obj
  18. closure.when={value,result->
  19. if(value==subject)
  20. thrownewMatchResultException
    (result:result)
  21. }
  22. closure.otherwise={returnit}
  23. closure.resolveStrategy=
    Closure.DELEGATE_FIRST
  24. try{
  25. closure()
  26. closure.otherwise()
  27. }catch(MatchResultExceptionr){
  28. r.result
  29. }
  30. }
  31. classMatchResultException
    extendsRuntimeException{
  32. defresult
  33. }
  34. defcar="Patriot"
  35. defmanufacturer=match(car){
  36. when"Focus","Ford"
  37. when"Navigator","Lincoln"
  38. when"Camry","Toyota"
  39. when"Civic","Honda"
  40. when"Patriot","Jeep"
  41. when"Jetta","VW"
  42. when"Ceyene","Porsche"
  43. when"Outback","Subaru"
  44. when"520i","BMW"
  45. when"Tundra","Nissan"
  46. otherwise"Unknown"
  47. }
  48. println"The$carismade
    by$manufacturer"
  49. defmatch(obj,closure){
  50. closure.subject=obj
  51. closure.when={value,result->
  52. if(value==subject)
  53. thrownewMatchResultException
    (result:result)
  54. }
  55. closure.otherwise={returnit}
  56. closure.resolveStrategy=
    Closure.DELEGATE_FIRST
  57. try{
  58. closure()
  59. closure.otherwise()
  60. }catch(MatchResultExceptionr){
  61. r.result
  62. }
  63. }
  64. classMatchResultException
    extendsRuntimeException{
  65. defresult
  66. }

我不是很喜欢里面用异常来控制程序的流程,而且觉得“when "Focus", "Ford"”中间的逗号不够直观,因此就在上面的Ruby case when表达式代码的基础上做了一些修改:

  1. defmatch(subject,closure){
  2. defwhenMap=[:],otherwise=null
  3. closure.when={map->whenMap.putAll(map)}
  4. closure.otherwise={otherwise=it}
  5. closure.resolveStrategy=Closure.DELEGATE_FIRST
  6. closure()
  7. defresult=whenMap.find{condition,
    value-
    >subjectincondition}
  8. returnresult?result.value:otherwise
  9. }
  10. defmanufacturer(car){
  11. match(car){
  12. when"Focus":"Ford"
  13. when"Navigator":"Lincoln"
  14. when"Camry":"Toyota"
  15. when"Civic":"Honda"
  16. when"Patriot":"Jeep"
  17. when"Jetta":"VW"
  18. when"Ceyene":"Porsche"
  19. when"Outback":"Subaru"
  20. when"520i":"BMW"
  21. when"Tundra":"Nissan"
  22. otherwise"Unknown"
  23. }
  24. }
  25. println"ThePatriotismade
    by${manufacturer('Patriot')}"
  26. println"TheQQismadeby$
    {manufacturer('QQ')}"
  27. defmatch(subject,closure){
  28. defwhenMap=[:],otherwise=null
  29. closure.when={map->whenMap.putAll(map)}
  30. closure.otherwise={otherwise=it}
  31. closure.resolveStrategy=Closure.
    DELEGATE_FIRST
  32. closure()
  33. defresult=whenMap.find{condition,
    value-
    >subjectincondition}
  34. returnresult?result.value:otherwise
  35. }
  36. defmanufacturer(car){
  37. match(car){
  38. when"Focus":"Ford"
  39. when"Navigator":"Lincoln"
  40. when"Camry":"Toyota"
  41. when"Civic":"Honda"
  42. when"Patriot":"Jeep"
  43. when"Jetta":"VW"
  44. when"Ceyene":"Porsche"
  45. when"Outback":"Subaru"
  46. when"520i":"BMW"
  47. when"Tundra":"Nissan"
  48. otherwise"Unknown"
  49. }
  50. }
  51. println"ThePatriotismade
    by${manufacturer('Patriot')}"
  52. println"TheQQismadeby$
    {manufacturer('QQ')}"

以上Ruby case when表达式代码在Groovy 1.6下编译通过。

转载请说明出处
知优网 » Ruby case when表达式实际应用解析

发表评论

您需要后才能发表评论