日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Rubycasewhen表達(dá)式實(shí)際應(yīng)用解析

Ruby語言中存在著許多表達(dá)式,這些表達(dá)式用法不盡相同,實(shí)現(xiàn)的功能也不同。熟練的掌握這些表達(dá)式的用法,可以有助于我們編程的方便性。今天看到有人在Groovy的郵件列表上問Groovy能不能支持Ruby case when表達(dá)式: #t#

Ruby case when表達(dá)式代碼示例:

  1. car = "Patriot"   
  2. manufacturer = case 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. else "Unknown"   
  14. end   
  15. puts "The " + car + " is made by 
    " + manufacturer   
  16. car = "Patriot" 
  17. manufacturer = case car  
  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 + " is made by 
    " + manufacturer 

然后Guillaume給出了這么一段Ruby case when表達(dá)式代碼:

 

 
 
 
  1. def car = "Patriot"   
  2. def manufacturer = 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 $car is made by 
    $manufacturer"   
  16. def match(obj, closure) {   
  17. closure.subject = obj   
  18. closure.when = { value, result ->   
  19. if (value == subject)   
  20. throw new MatchResultException
    (result: result)   
  21. }   
  22. closure.otherwise = { return it }   
  23. closure.resolveStrategy = 
    Closure.DELEGATE_FIRST   
  24. try {   
  25. closure()   
  26. closure.otherwise()   
  27. } catch (MatchResultException r) {   
  28. r.result   
  29. }   
  30. }   
  31. class MatchResultException
     extends RuntimeException {   
  32. def result   
  33. }   
  34. def car = "Patriot" 
  35. def manufacturer = 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 $car is made 
    by $manufacturer"  
  49. def match(obj, closure) {  
  50. closure.subject = obj 
  51. closure.when = { value, result -> 
  52. if (value == subject)  
  53. throw new MatchResultException
    (result: result)  
  54. }  
  55. closure.otherwise = { return it }  
  56. closure.resolveStrategy = 
    Closure.DELEGATE_FIRST  
  57. try {  
  58. closure()  
  59. closure.otherwise()  
  60. } catch (MatchResultException r) {  
  61. r.result  
  62. }  
  63. }  
  64. class MatchResultException 
    extends RuntimeException {  
  65. def result  

我不是很喜歡里面用異常來控制程序的流程,而且覺得“when "Focus", "Ford"”中間的逗號(hào)不夠直觀,因此就在上面的Ruby case when表達(dá)式代碼的基礎(chǔ)上做了一些修改:

 
 
 
  1. def match(subject, closure) {   
  2. def whenMap = [:], otherwise = null   
  3. closure.when = { map -> whenMap.putAll(map) }   
  4. closure.otherwise = { otherwise = it }   
  5. closure.resolveStrategy = Closure.DELEGATE_FIRST   
  6. closure()   
  7. def result = whenMap.find { condition, 
    value -> subject in condition }   
  8. return result ? result.value : otherwise   
  9. }   
  10. def manufacturer(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 "The Patriot is made
     by ${manufacturer('Patriot')}"   
  26. println "The QQ is made by $
    {manufacturer('QQ')}"   
  27. def match(subject, closure) {  
  28. def whenMap = [:], otherwise = null 
  29. closure.when = { map -> whenMap.putAll(map) }  
  30. closure.otherwise = { otherwise = it }  
  31. closure.resolveStrategy = Closure.
    DELEGATE_FIRST  
  32. closure()  
  33. def result = whenMap.find { condition, 
    value -> subject in condition }  
  34. return result ? result.value : otherwise  
  35. }  
  36. def manufacturer(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 "The Patriot is made
     by ${manufacturer('Patriot')}"  
  52. println "The QQ is made by $
    {manufacturer('QQ')}" 

以上Ruby case when表達(dá)式代碼在Groovy 1.6下編譯通過。


標(biāo)題名稱:Rubycasewhen表達(dá)式實(shí)際應(yīng)用解析
網(wǎng)站路徑:http://m.5511xx.com/article/dppssee.html