Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Scala中的条件隐函数_String_Scala_Dsl_Implicit Conversion_Implicit - Fatal编程技术网

String Scala中的条件隐函数

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) 但是我不知道如何修改它,以便只为某些字符串创建这个隐式函数。是否可以为隐式函

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

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
)?您能说说如何使用这个隐式函数吗?即使有可能,我也看不出如何有效地使用它