2

我有以下方法:

def lift[P <: Product, L <: HList](params: P)(implicit hl: Generic.Aux[P, L]) = {
  directive[L](_(hl to params))
}

如果我通过两个以上的参数,它就可以完美地工作:

val result  = lift("string", 'a', 10) // compiles
val result2 = list(true, 5) // compiles

但是当我传递一个参数时,它无法隐式解析:

val failes = lift("string") 

它找不到 Generic implicit for [String, Nothing],为什么它在其他情况下有效?

4

1 回答 1

2

您会看到自动元组的结果,这是一个 Scala(错误)功能,当没有具有适当数量值(在本例中为两个)的方法时,它会导致lift(true, 5)被解析。但是,编译器不会自动将单个值包装在 a中——你只会得到一个编译器错误。lift((true, 5))liftTuple1

例如,有关自动元组的更多详细信息,请参见此答案,并且出于某些原因,自动元组在您的语言中包含在内是一件可怕的事情。

有几种可能的解决方法。第一个是创建从值到的隐式转换,如this answerTuple1中所建议的那样。我个人不会推荐这种方法——你在代码中引入的每一个隐式转换都是雷区中的另一个地雷。

相反,我建议完全避免 autotupling。明确地写出来list((true, 5))——你只需要几个额外的字符就可以得到很多额外的清晰度。不幸的是,没有类似的文字支持Tuple1,所以你必须写出lift(Tuple1("string")),但即使这样也不算太糟糕,如果你真的想要你可以定义一个新的liftOne方法来为你做这件事。

于 2014-03-13T17:32:15.867 回答