是否可以在 Scala 中装饰方法?
Is it possible to decorate methods in scala?
所以,我有一个对象,带有方法,类似这样的东西:
object Connector {
def createObject (id : Long, x : Double, y : Double, name : String, objtype : Int, layer : String) : String = {
//some code
}
def deleteObject (id : Long) : String = {
//some code
}
def findObject (name : String) : String = {
//some code
}
//some other methods
}
例如,我想处理所有方法中的错误,使用相同的代码:
var res = domethod(methodParams)
if (res.indexOf("Error") > 0){
doSomeOtherMethod() //that can fix error
res = domethod(methodParams) //with same params
}
return res
在 Scala 中有没有办法处理这样的错误,并且没有代码重复?
您可以创建一个私有函数来处理您的错误:
private def tryUnsafe(f: => String): String = {
var res = f()
if (res.indexOf("Error") > 0){
doSomeOtherMethod() //that can fix error
res = f()
}
return res
}
您可以这样调用 tryUnsafe
:
tryUnsafe {
// code that eventually return a String
}
编辑:添加详细信息以解决第一条评论。
您可以像这样在您的函数中使用 tryUnsafe
:
def createObject (id : Long, x : Double, y : Double, name : String, objtype : Int, layer : String) : String = {
tryUnsafe {
// the code to create an object, that returns a String
}
}
在回答你的问题时我假设
* domethod
是 createObject
、deleteObject
等的占位符
* doSomeOtherMethod
对于所有 domethod
都是相同的,而不是每个操作特定的一个,如果不是这种情况,除了 f
之外,您还可以使用 g
参数来调用你的 if
语句。
所以,我有一个对象,带有方法,类似这样的东西:
object Connector {
def createObject (id : Long, x : Double, y : Double, name : String, objtype : Int, layer : String) : String = {
//some code
}
def deleteObject (id : Long) : String = {
//some code
}
def findObject (name : String) : String = {
//some code
}
//some other methods
}
例如,我想处理所有方法中的错误,使用相同的代码:
var res = domethod(methodParams)
if (res.indexOf("Error") > 0){
doSomeOtherMethod() //that can fix error
res = domethod(methodParams) //with same params
}
return res
在 Scala 中有没有办法处理这样的错误,并且没有代码重复?
您可以创建一个私有函数来处理您的错误:
private def tryUnsafe(f: => String): String = {
var res = f()
if (res.indexOf("Error") > 0){
doSomeOtherMethod() //that can fix error
res = f()
}
return res
}
您可以这样调用 tryUnsafe
:
tryUnsafe {
// code that eventually return a String
}
编辑:添加详细信息以解决第一条评论。
您可以像这样在您的函数中使用 tryUnsafe
:
def createObject (id : Long, x : Double, y : Double, name : String, objtype : Int, layer : String) : String = {
tryUnsafe {
// the code to create an object, that returns a String
}
}
在回答你的问题时我假设
* domethod
是 createObject
、deleteObject
等的占位符
* doSomeOtherMethod
对于所有 domethod
都是相同的,而不是每个操作特定的一个,如果不是这种情况,除了 f
之外,您还可以使用 g
参数来调用你的 if
语句。