繁体   English   中英

Scala中的条件隐式函数

[英]Conditional Implicit functions in Scala

我正在尝试在Scala中设计DSL。 为此,我想在精确的字符串上创建一个隐式函数。 我知道要为任何String创建一个隐式函数,我可以写:

class StringPlus(str: String) {
    def some_function(): Unit = do_something
}
implicit def string2StringPlus(str: String) = new StringPlus(str)

但我不知道如何修改它只为某些字符串创建这个隐式函数。 是否可以为隐式函数赋予布尔条件,以便仅在布尔条件为真时才创建隐式函数(例如,如果字符串的长度为5或更大,如果字符串的第一个字母是字母“a”等)并不是所有的字符串?

简短的回答

不,这是不可能的。

类型和含义在编译时解析,而String的实际值是运行时实体,即运行之间可能不同。 因此,在编译时不可能知道将哪个字符串值传递给隐式函数。

答案很长

它可能是可能的,但包括大量的魔术类型,它在可读性和实用性方面绝对不是一个好的解决方案。

以下是您的想法:您可以为字符串创建自定义类型,并对该类型中的必要条件进行编码。 例如,对于以“a”开头的字符串,您将使用AString[String[...]] ,对于3个字母的字符串,您将使用String[String[String[StringNil]]] ,依此类推。

然后,所有字符串转换将产生适当的类型,例如,当您使用字母A添加String[...]时,您将获得AString[String[...]] ,依此类推。

看看依赖类型HList的实现。

但同样,在你的情况下,它几乎不实用。

UPD :另请参阅Refined项目,它提供了类型级谓词。

暂无
暂无

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

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