我如何创建一个与字符串一起工作的元类;数字和空值

how I could create a metaclass that work with string ; numbers and null values

一个使用数字值字符串值和空值的元类

喜欢这段代码;请帮助我

String.metaClass.formatx = { delegate.toString().replaceAll(/null/, '0.0').toFloat() }


m= "4".formatx()

m2=4.formatx()
m3=null.formatx()

如果我是你,我会做以下事情:

String.metaClass.formatx = { -> delegate.toFloat() }

String a = "3"
String b = null

assert 3.0f == (a?.formatx() ?: 0.0f)
assert 0.0f == (b?.formatx() ?: 0.0f)

也就是说,在你的代码中使用 ?.?:

来防御 null

如果您尝试捕捉null并格式化它,您可以做:

import org.codehaus.groovy.runtime.NullObject

String.metaClass.formatx = { -> delegate.toFloat() }
NullObject.metaClass.formatx = { -> 0.0f }

String a = "3"
String b = null

assert 3.0f == a.formatx()
assert 0.0f == b.formatx()

但是给NullObject加个方法感觉不对,之前没做过

编辑

这个更短

import org.codehaus.groovy.runtime.NullObject

[String, Integer].each { it.metaClass.formatx = { -> delegate.toFloat() } }
NullObject.metaClass.formatx = { -> 0.0f }

println null.formatx()
println 3.formatx()
println "4".formatx()

我举这个例子,但我认为我使用了很多代码

我重复metaClass.formatx三遍;我不知道是否可以使用 OR setences INSTEAD

import org.codehaus.groovy.runtime.NullObject

String.metaClass.formatx = { -> delegate.toString().replaceAll(/null/, '0.0').toFloat()  }
 NullObject.metaClass.formatx = { -> delegate.toString().replaceAll(/null/, '0.0').toFloat() }
Integer.metaClass.formatx = { -> delegate.toString().replaceAll(/null/, '0.0').toFloat() }

m2= 4.formatx()
m= "4".formatx()

 println null.formatx()

编辑

import org.codehaus.groovy.runtime.NullObject



[String, Integer,NullObject].each { it.metaClass.formatx = { ->  delegate.toString().replaceAll(/null/, '0.0').toFloat()    } }

m2= 4.formatx()
m= "4".formatx()

 println null.formatx()