我如何创建一个使用字符串的元类;数字和空值

时间:2018-03-14 17:31:24

标签: groovy metaclass

使用数值字符串值和空值

的元类 像这样的代码;请帮帮我

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


m= "4".formatx()

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

2 个答案:

答案 0 :(得分:2)

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

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()

答案 1 :(得分:0)

我把它作为例子,但我认为我使用了很多代码

我重复三次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()