Scala 功能2和功能3的润滑脂特性
我有一个类型为的函数Scala 功能2和功能3的润滑脂特性,scala,Scala,我有一个类型为的函数 (String, String) => String (String, String, String) => String 和另一个具有类型的函数 (String, String) => String (String, String, String) => String 有没有一种方法可以干净地创建一个公共特性/超类,这样我就可以传递它们的列表 编辑: 我正在传递更多关于这方面的信息,因为专家们对我的问题很好奇,我想把上面两种类型添加到一个列
(String, String) => String
(String, String, String) => String
和另一个具有类型的函数
(String, String) => String
(String, String, String) => String
有没有一种方法可以干净地创建一个公共特性/超类,这样我就可以传递它们的列表
编辑:
我正在传递更多关于这方面的信息,因为专家们对我的问题很好奇,我想把上面两种类型添加到一个列表中。我试图将它们((String,String)=>String和(String,String,String)=>String)添加到一个列表中,因为我正在创建一个测试套件,它获取一个表列表并运行一个检查条件的方法(条件就是方法)
所以我试图创建一个这样的类
type DatabaseName = String
type TableName = String
type ColName = String
type Output = String
class TestFn(functionName : String, listOfTables : List[String], functionToRun : (DatabaseName, TableName) => Output)
我获取输出并将其存储为数据帧。我希望这是可扩展的。另一个开发人员向我展示了一个包含此签名的测试用例
(DatabaseName, TableName, ColName) => String
因此,我希望能够创建一个超类/trait,以便它可以接受任何函数((String,String)=>String或(String,String,String)=>String),并在他的表列表中运行该函数
列表中
?你希望达到什么目的?(这看起来很经典。)列表中提取时,您如何想象调用这些函数
type Str2Func = (String,String) => String
type Str3Func = (String,String,String) => String
val s2f:Str2Func = (x,y) => x.toUpperCase + y.toLowerCase
val s3f:Str3Func = (x,y,z) => z + y + x
将它们放入列表后
我们可以看到这些类型的当前LUB(最小上限)
List(s2f, s3f) //List[Object]
不是很有用,但是,很难想象一个LUB可以同时覆盖这两种类型并执行(调用)这两种类型
一种可能的解决方案是将每个Str2Func
升级为一个只忽略其一个参数的Str3Func
这种转换可以自动完成,但隐式转换可能是危险的,而且是危险的,因此我们将使转换显式但不引人注目
implicit class SF2to3(f2:Str2Func) {
def to3: Str3Func = (a:String, b:String, _:String) => f2(a,b)
}
val s3fs:List[Str3Func] = List(s2f.to3, s3f)
每个元素都可以独立调用
s3fs.map(_("Aa","Bb","Cc"))
//res0: List[String] = List(AAbb, CcBbAa)
我怀疑它,除非你想要
任何,因为你以后无论如何都得投它。你需要这个做什么?可能有一个解决方案。你如何调用这样的函数?考虑在这些函数上调用<代码> tuple < /代码>,这样你就可以做<代码> [tString ] < /代码>。我只推荐一个<代码>列表[String ]。
,但是。我不认为使用同质元组有多大意义。您仍然没有回答我的问题,假设您能够在一个列表中同时拥有两个函数,您将如何调用它们?如果您只传递两个参数,但列表中有三个参数,那么您将缺少一个,除非您有一个defaullt,如果您传递了三个,并且函数是两个函数中的一个它会忽略一个,或者你想检查它是两个还是三个的函数来决定如何调用它?或者每个函数都应该已经定义了它的参数,而你只想延迟它的执行?或者…-那么,你怎么可以这样做一个函数?你可以使用或者[(String,String)=>String,(String,String,String)=>String]
,但正如@LuisMiguelMejíaSuárez所说,您还应该在这个问题中添加如何使用函数。谢谢,我添加了更多信息,请检查。