我正试图在Scala中设计一个DSL。为此,我想在精确的字符串上创建一个隐式函数。我知道要为任何字符串创建隐式函数,我可以编写:
class StringPlus(str: String) {
def some_function(): Unit = do_something
}
implicit def string2StringPlus(str: String) = new StringPlus(str)但是,我不知道如何修改它,以便只为某些字符串创建这个隐式函数。是否可以向隐式函数提供布尔条件,以便只在布尔条件为真时才创建隐式函数(例如,如果字符串的长度为5或更长,字符串的第一个字母是字母"a",等等)。而不是所有的弦乐?
发布于 2016-04-14 00:33:03
简短回答
不,这不可能。
类型和隐式是在编译时解析的,而字符串的实际值是运行时实体,也就是说,它在运行期间可能有所不同。因此,在编译时不可能知道哪个字符串值将传递给隐式函数。
长答案
它可能是可能的,但包含了大量的类型魔术,而且它在可读性和实用性方面肯定不是一个很好的解决方案。
如下所示:您可以为您的字符串创建自定义类型,并在该类型中编码必要的条件。例如,AString[String[...]]用于以"a“开头的字符串,String[String[String[StringNil]]]用于3个字母的字符串,依此类推。
然后,所有字符串转换都会产生适当的类型,例如,当您在String[...]前面加上字母A时,您将得到AString[String[...]],等等。
看看相依类型和HList的实现。
但是,在你的情况下,这是不太现实的。
UPD:还可以查看提供类型级谓词的精练项目。
https://stackoverflow.com/questions/36611570
复制相似问题