2016-04-09 24 views
1

Bulunursa, parantez içinde bulunan değeri döndüren veya boş bir değer döndüren bir arama listesine sahip olmak istiyorum. Enum kullanmak istemiyorum.Groovy öğenin eşleşme değerini döndürür ve eğer boş bulunursa parantezle geri dön

Bunun gibi

:

def grt = { ['mail': 'Scanned Paper', 'digital': 'Digital Things', 'barcode': 'Some Barcode Matter'].get(it) } 

def s = grt('digital') ? "($grt('digital')" : '' 
println "Report $s" 

Ama (it) get'in ucunda toplamak çeşit olduğunu o yüzden daha basit yapmak ve 'def s' hattını ortadan kaldırmak istiyoruz ve tüm açık Tek çizgi. Bir elvis yapabilirsiniz ancak

Hatta gibi meta programlama yapabilirsiniz) (koymuyor:

Object.metaClass.prettyString = { delegate ? "($delegate)" : '' } 

ve sonra sadece yapmak zorunda

println "Report $grt('digital').prettyString()" 

olmalı

bir tür, ancak bu çalışmaz. get çağrılırken

def grt = { 
    [ 
     'mail': 'Scanned Paper', 
     'digital': 'Digital Things', 
     'barcode': 'Some Barcode Matter' 
    ][it].with { 
     delegate ? "($delegate)" : '' 
    } 
} 

println "Report ${grt('digital')}" 

cevap

3

Burada bir satırda bunu yapmak için bir yoldur.

def grt = { 
    [ 
     'mail': 'Scanned Paper', 
     'digital': 'Digital Things', 
     'barcode': 'Some Barcode Matter' 
    ].get(it, '') 
} 

println "Report ${grt('digital')}" 
+0

Kusursuz, aradığım şey budur. 'Ile' yöntemi tam olarak cevaptır. Btw Ben aslında [it] kullandı ama başkaları tarafından daha okunabilir olduğu gibi .get (o) olarak değiştirildi. –

1

Varsayılan bir yarar sağlayabilir:

+0

Bu çözümü daha çok beğeniyorum – GLaDOS

+0

Jeff Ben Emmanuel'in cevabını, yani parantez içinde - yani (Dijital Şeyler) bulunduğu takdirde - sadece boş bir dizgi döndüren anahtar gereksinimini kaçırdığı için tercih ettim. Ama farketmediğim kadar güzel, varsayılan bir sonuç elde edebilirsiniz. –