text:"Enter the port number used by the program (${defaultPort}): "
有没有办法将此值读入String或GString,然后绑定到活动程序值(如defaultPort)?
在处理此代码的代码中,“defaultValue”可以设置为多个值.例如,如果使用http,则该值可能为80,但如果使用https,则可能为443.
我意识到SimpleTemplateEngine会起作用,但有更简单的方法吗?
两个不起作用的解决方案:
1)
text:{ value -> "Enter the port number used by the program ($value)" }
好的,实际上这确实有效!但是,我不能(或者不认为我可以)使用这种方法,因为这是例外情况,绝大多数用途只会读取文本.这种方法要求您将其称为一种会破坏所有其他用途的方法.
我尝试将其作为Java String(单引号)读取并从中创建一个GString.我甚至不会展示代码 – 这是新的一年,而不是愚人节!我只想说我无法工作!
2)
我也试过这个的变种:
def defaultPort = determinePort() def textVal = myConfig.text // trIEd single and double quotes in the config filedef newVal = "${writer -> writer << textVal}"
谢谢你的帮助.
根据loteq的回答添加更多细节
如果很清楚,这里有一个更详细的草图,我想做什么:
// questions would be in a file parseable by ConfigSlurper:someIDentifIEr { questions =[1:[text:'Enter http or https ',anotherFIEld: 'some value',method2Use: 'getinput'],2:[text:'Enter the port number used by the program (${defaultPort}): ',method2Use: 'getinput'] ]}def myConfig = new ConfigSlurper().parse(questionConfigfile.groovy)def questions = myConfig.someIDentifIEr?.questionsquestions?.each{ number,details -> // need a way in here to have the answer of the first question // determine a value of either 80 or 443 (80 = http,443 = https) // and use that to substitute into the 'text' of the second question}
对不起,如果这太详细了 – 我希望它可能会有所帮助.
解决方法 为什么不尝试ConfigSlurper方法?String configScript='''text1="Enter the port number used by the program (${defaultPort}): "text2="normal text"'''def sl=new ConfigSlurper()sl.setBinding(defaultPort:8080)def cfg=sl.parse(configScript)cfg.each{println it}
结果:
text1=Enter the port number used by the program (8080): text2=normal text
更新,基于问题第二部分的更多细节
您可以使用groovy的动态调度功能来很好地处理字符串和闭包.
// questions would be in a file parseable by ConfigSlurper:someIDentifIEr { questions =[1:[text:'Enter http or https ',method2Use: 'getinput' responseBinding: 'protocol' ],2:[text:{binding->"Enter the port number used by the program (${binding.defaultPort}): ",method2Use: 'getinput' responseBinding: 'port' ] ]}def myConfig = new ConfigSlurper().parse(questionConfigfile.groovy)def questions = myConfig.someIDentifIEr?.questionsdef binding=[:]questions?.each{ number,details -> this."processResponse$number"(this."${details.method2Use}"(details.text,details,binding))}voID processResponse1(Map binding) { def defaultPorts =[ https:443,http:80 ] binding.defaultPort=defaultPorts[binding.protocol]}voID processResponse2(Map binding) { //}Map getinput(String prompt,Map interactionDetails,Map binding) { binding[interactionDetails.responseBinding] = readinput(prompt) binding}Map getinput(Closure<String> prompt,Map binding) { binding[interactionDetails.responseBinding] = readinput(prompt(binding)) binding}
UPDATE
一种截然不同的方法,在我看来,更清洁,是定义DSL:
def configScript=''' someIDentifIEr = { protocol=getinput("Enter http or https") port=getinput("Enter the port used for $protocol (${defaultPorts[protocol]}):") }'''
您仍然可以使用configSlurper来解析文件,但是您将针对将实现的委托运行闭包someIDentifIEr:
class Builder { def defaultPorts =[ https:'443',http:'80' ] String protocol String port def getinput(String prompt) { System.console().readline(prompt) } voID setPort(String p) { port = p ?: defaultPorts[protocol] } String toString() { """ |protocol=$protocol |port=$port """.stripmargin() }}
然后:
def sl=new ConfigSlurper()def cfg=sl.parse(configScript)def ID=cfg.someIDentifIEr.clone()def builder=new Builder()ID.delegate=builderID.resolveStrategy=Closure.DELEGATE_ONLYID()println builder
这允许您通过在委托中添加方法来自然地丰富您的交互,而不是痛苦地向此地图添加元素.
总结以上是内存溢出为你收集整理的后期绑定Groovy String?全部内容,希望文章能够帮你解决后期绑定Groovy String?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)