Dus*_*009 5 string dsl scala implicit implicit-conversion
我正在尝试在Scala中设计DSL.为此,我想在精确的字符串上创建一个隐式函数.我知道要为任何String创建一个隐式函数,我可以写:
class StringPlus(str: String) {
def some_function(): Unit = do_something
}
implicit def string2StringPlus(str: String) = new StringPlus(str)
Run Code Online (Sandbox Code Playgroud)
但我不知道如何修改它只为某些字符串创建这个隐式函数.是否可以为隐式函数赋予布尔条件,以便仅在布尔条件为真时才创建隐式函数(例如,如果字符串的长度为5或更大,如果字符串的第一个字母是字母"a"等)并不是所有的字符串?
不,这是不可能的.
类型和含义在编译时解析,而String的实际值是运行时实体,即运行之间可能不同.因此,在编译时不可能知道将哪个字符串值传递给隐式函数.
这可能是有可能的,但包含了大量的魔术类型,在可读性和实用性方面肯定不是一个好的解决方案.
以下是您的想法:您可以为字符串创建自定义类型,并对该类型中的必要条件进行编码.例如,对于3个字母的字符串,您将拥有AString[String[...]]以"a" String[String[String[StringNil]]]开头的字符串,依此类推.
然后,所有字符串转换将产生适当的类型,例如,当您String[...]使用字母前置时A,您将获得AString[String[...]],等等.
但同样,在你的情况下,它几乎不实用.
UPD:另请参阅Refined项目,它提供了类型级谓词.
| 归档时间: |
|
| 查看次数: |
355 次 |
| 最近记录: |