Ruby语言中存在着许多表达式,这些表达式用法不尽相同,实现的功能也不同。熟练的掌握这些表达式的用法,可以有助于我们编程的方便性。今天看到有人在Groovy的邮件列表上问Groovy能不能支持Ruby case when表达式: #t#
Ruby case when表达式代码示例:
然后Guillaume给出了这么一段Ruby case when表达式代码:
- def car = "Patriot"
- def manufacturer = match(car) {
- when "Focus", "Ford"
- when "Navigator", "Lincoln"
- when "Camry", "Toyota"
- when "Civic", "Honda"
- when "Patriot", "Jeep"
- when "Jetta", "VW"
- when "Ceyene", "Porsche"
- when "Outback", "Subaru"
- when "520i", "BMW"
- when "Tundra", "Nissan"
- otherwise "Unknown"
- }
- println "The $car is made by
$manufacturer"- def match(obj, closure) {
- closure.subject = obj
- closure.when = { value, result ->
- if (value == subject)
- throw new MatchResultException
(result: result)- }
- closure.otherwise = { return it }
- closure.resolveStrategy =
Closure.DELEGATE_FIRST- try {
- closure()
- closure.otherwise()
- } catch (MatchResultException r) {
- r.result
- }
- }
- class MatchResultException
extends RuntimeException {- def result
- }
- def car = "Patriot"
- def manufacturer = match(car) {
- when "Focus", "Ford"
- when "Navigator", "Lincoln"
- when "Camry", "Toyota"
- when "Civic", "Honda"
- when "Patriot", "Jeep"
- when "Jetta", "VW"
- when "Ceyene", "Porsche"
- when "Outback", "Subaru"
- when "520i", "BMW"
- when "Tundra", "Nissan"
- otherwise "Unknown"
- }
- println "The $car is made
by $manufacturer"- def match(obj, closure) {
- closure.subject = obj
- closure.when = { value, result ->
- if (value == subject)
- throw new MatchResultException
(result: result)- }
- closure.otherwise = { return it }
- closure.resolveStrategy =
Closure.DELEGATE_FIRST- try {
- closure()
- closure.otherwise()
- } catch (MatchResultException r) {
- r.result
- }
- }
- class MatchResultException
extends RuntimeException {- def result
- }
我不是很喜欢里面用异常来控制程序的流程,而且觉得“when "Focus", "Ford"”中间的逗号不够直观,因此就在上面的Ruby case when表达式代码的基础上做了一些修改:
- def match(subject, closure) {
- def whenMap = [:], otherwise = null
- closure.when = { map -> whenMap.putAll(map) }
- closure.otherwise = { otherwise = it }
- closure.resolveStrategy = Closure.DELEGATE_FIRST
- closure()
- def result = whenMap.find { condition,
value -> subject in condition }- return result ? result.value : otherwise
- }
- def manufacturer(car) {
- match(car) {
- when "Focus": "Ford"
- when "Navigator": "Lincoln"
- when "Camry": "Toyota"
- when "Civic": "Honda"
- when "Patriot": "Jeep"
- when "Jetta": "VW"
- when "Ceyene": "Porsche"
- when "Outback": "Subaru"
- when "520i": "BMW"
- when "Tundra": "Nissan"
- otherwise "Unknown"
- }
- }
- println "The Patriot is made
by ${manufacturer('Patriot')}"- println "The QQ is made by $
{manufacturer('QQ')}"- def match(subject, closure) {
- def whenMap = [:], otherwise = null
- closure.when = { map -> whenMap.putAll(map) }
- closure.otherwise = { otherwise = it }
- closure.resolveStrategy = Closure.
DELEGATE_FIRST- closure()
- def result = whenMap.find { condition,
value -> subject in condition }- return result ? result.value : otherwise
- }
- def manufacturer(car) {
- match(car) {
- when "Focus": "Ford"
- when "Navigator": "Lincoln"
- when "Camry": "Toyota"
- when "Civic": "Honda"
- when "Patriot": "Jeep"
- when "Jetta": "VW"
- when "Ceyene": "Porsche"
- when "Outback": "Subaru"
- when "520i": "BMW"
- when "Tundra": "Nissan"
- otherwise "Unknown"
- }
- }
- println "The Patriot is made
by ${manufacturer('Patriot')}"- println "The QQ is made by $
{manufacturer('QQ')}"
以上Ruby case when表达式代码在Groovy 1.6下编译通过。
新闻名称:Rubycasewhen表达式实际应用解析
网址分享:http://www.shufengxianlan.com/qtweb/news33/323183.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联