繁体   English   中英

Scala中的多个独立隐式

[英]multiple independent implicits in Scala

Scala很酷。 但有时也会由于许多看似随意的限制以及无法正常工作的情况而感到沮丧。

在这种情况下,我在Scala中编写了一个参数解析库。 它具有以下功能:

def option[T](
  name1: String, name2: String = null, name3: String = null,
  name4: String = null, name5: String = null, name6: String = null,
  name7: String = null, name8: String = null, name9: String = null,
  default: T = null.asInstanceOf[T],
  metavar: String = null,
  choices: Seq[T] = null,
  aliases: Map[T, Iterable[T]] = null,
  help: String = "")
(implicit convert: (String, String, ArgParser) => T, m: Manifest[T]) = {
  optionSeq[T](nonNullVals(name1, name2, name3, name4, name5, name6,
    name7, name8, name9),
    metavar = metavar, default = default, choices = choices,
    aliases = aliases, help = help)(convert, m)
}

本质上,这声明了给定类型的普通选项参数。 有一个隐式函数,将使用适合该类型的默认转换器进行填充。 还有一个隐式清单,这是必需的,因为我需要能够对某些事情加以限制。

在我尝试实际提供非默认转换器之前,此方法一直有效。 如所写,您不仅可以提供转换器,还必须提供清单,我不知道该怎么做,而且无论如何它都非常丑陋-清单是一个讨厌的垃圾,旨在解决大部分问题JVM中的错误,不应暴露给最终用户。

我已经知道Scala不允许您在单个参数列表中混合使用隐式参数和非隐式参数-IMO是一个任意且不必要的限制,但事实如此。 因此,我尝试将隐式参数列表分为两个单独的参数列表,每个参数列表都有一个隐式。 运气不好-Scala似乎还会阻止您拥有多个隐式参数列表(另一种看似随意的限制)。

我不知道如何解决此问题。 有什么建议吗?

此外,当前是否有任何尝试在将来的Scala版本中解决对隐式的某些限制(和/或想出一种比清单更隐蔽的方式来解决类型擦除损坏的问题,而这不是IMO的清单)?

你总是可以得到implicit式的T的背景与implicitly[T] 因此,如果您需要显式地编写编译器将提供的隐式Manifest[T] ,则可以使用implicitly[Manifest[T]]

只要您想在隐式参数列表中提供一个参数,而其他参数保持不变,则可以使用此方法,只需对不需要的参数隐式使用[TheTypeOfTheImplicit]。

对于清单来说, Predef恰好有一个捷径,它就是manifest[T] (这只是implicitly[Manifest[T]] )。

注意: implicitly不是魔术,而是在Predef. def implicitly[T](implicit e: T) = e Predef.

这是一个非常尴尬的方法。 九个显式名称参数? 隐式选择转换函数? 我不确定清单是否是这里最严重的问题。

无论如何,你可以

class Converter[T: Manifest](val f: (String, String, ArgParser) => T) {
  def m = manifest[T]
}
implicit def function_to_converter[T: Manifest](f: (String, String, ArgParser) => T) =
  new Converter { def apply(s1: String, s2: String, ap: ArgParser) = f(s1,s2,ap) }
}

然后使用它代替您拥有的两个参数。 定义所有默认转换器,例如

implicit val convert_to_int: Converter = (s1: String, s2: String, ap: ArgParser) => ...

然后,如果用户需要显式填写一个,则只需提供功能并进行隐式转换即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM