String Scala中的条件隐函数
我正在尝试用Scala设计一个DSL。为此,我想在精确字符串上创建一个隐式函数。 我知道,要为任何字符串创建隐式函数,我可以编写:String Scala中的条件隐函数,string,scala,dsl,implicit-conversion,implicit,String,Scala,Dsl,Implicit Conversion,Implicit,我正在尝试用Scala设计一个DSL。为此,我想在精确字符串上创建一个隐式函数。 我知道,要为任何字符串创建隐式函数,我可以编写: class StringPlus(str: String) { def some_function(): Unit = do_something } implicit def string2StringPlus(str: String) = new StringPlus(str) 但是我不知道如何修改它,以便只为某些字符串创建这个隐式函数。是否可以为隐式函
class StringPlus(str: String) {
def some_function(): Unit = do_something
}
implicit def string2StringPlus(str: String) = new StringPlus(str)
但是我不知道如何修改它,以便只为某些字符串创建这个隐式函数。是否可以为隐式函数提供一个布尔条件,使隐式函数仅在布尔条件为真时(例如,如果字符串长度为5或更多,如果字符串的第一个字母是字母“a”等)而不是所有字符串时创建?简短回答
不,不可能
类型和隐式是在编译时解析的,而字符串的实际值是运行时实体,也就是说,运行之间可能不同。所以在编译时不可能知道哪个字符串值将被传递给隐式函数
长话短说
它可能是可能的,但包含了大量的类型魔术,从可读性和实用性方面来说,它肯定不是一个好的解决方案
其思想是:您可以为字符串创建自定义类型,并在该类型中编码必要的条件。例如,对于以“a”开头的字符串,String[String[…]]
,对于3个字母的字符串,String[String[StringNil]]]
,等等
然后,所有字符串转换都将产生适当的类型,例如,当您用字母A
预加string[…]
时,您将得到AString[string[…]
,等等
请看一看和实施
但同样,在你的情况下,这几乎是不实际的
UPD:还可以看看提供类型级谓词的项目 您的字符串在编译时是常量(例如
magicMethod“this always foo”
)还是依赖于运行时(例如magicMethod readFromStdIO
)?您能说说如何使用这个隐式函数吗?即使有可能,我也看不出如何有效地使用它