我正在尝试用 Scala 设计 DSL。为此,我想在精确字符串上创建一个隐式函数。 我知道要为任何字符串创建隐式函数,我可以编写:
class StringPlus(str: String) {
def some_function(): Unit = do_something
}
implicit def string2StringPlus(str: String) = new StringPlus(str)
但我不知道如何修改它以仅为某些字符串创建此隐式函数。是否可以给隐式函数一个 bool 条件,以便仅当 bool 条件为 true 时才创建隐式函数(例如,如果字符串的长度为 5 或更长,如果字符串的第一个字母是字母“a”等)而不是所有字符串?
最佳答案
简短回答
不,这是不可能的。
类型和隐式在编译时解析,而字符串的实际值是运行时实体,即在运行之间可能有所不同。因此在编译时不可能知道哪个字符串值将传递给隐式函数。
长答案
这也许是可能的,但包含大量的类型魔法,就可读性和实用性而言,它绝对不是一个好的解决方案。
这个想法是:您可以为字符串创建自定义类型并在该类型中编码必要的条件。例如,对于以“a”开头的字符串,您将使用 AString[String[...]]
,String[String[String[StringNil]]]
对于 3 个字母的字符串,依此类推。
所有字符串转换都会产生适当的类型,例如,当您在 String[...]
前面加上字母 A
时,您将得到 AString[String[...]]
,依此类推。
看看dependent types以及实现HList .
但同样,这对于您的情况来说几乎不实用。
UPD:另请查看 Refined项目,提供类型级谓词。
关于string - Scala 中的条件隐式函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36611570/