string - Scala 中的条件隐式函数

标签 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)

但我不知道如何修改它以仅为某些字符串创建此隐式函数。是否可以给隐式函数一个 bool 条件,以便仅当 bool 条件为 true 时才创建隐式函数(例如,如果字符串的长度为 5 或更长,如果字符串的第一个字母是字母“a”等)而不是所有字符串?

最佳答案

简短回答

不,这是不可能的。

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

长答案

这也许是可能的,但包含大量的类型魔法,就可读性和实用性而言,它绝对不是一个好的解决方案。

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

所有字符串转换都会产生适当的类型,例如,当您在 String[...] 前面加上字母 A 时,您将得到 AString[String[...]],依此类推。

看看dependent types以及实现HList .

但同样,这对于您的情况来说几乎不实用。

UPD:另请查看 Refined项目,提供类型级谓词。

关于string - Scala 中的条件隐式函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36611570/

相关文章:

java - 搜索数组中的单词

scala - 如果类型安全配置中不存在系统变量,如何设置默认列表值?

python - 编织 N 个等长的可迭代参数

c++ - 为什么 std::ifstream 构造函数不采用 std::string?

scala - 通过导入: Bad Idea?来扩展实例化对象

scala - 当类型别名有换行符且没有等号时,为什么 scala 会计算类型别名?

haskell - 对于更多类型安全的 DSL,可绑定(bind)仿函数是否是有用的抽象?

elasticsearch - 术语字段汇总

java - HttpRequestHandlingMessagingGateway PayloadExpression java 配置

java - 为什么java String将一些UTF-8符号视为多个字符