加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

string – Scala中的条件隐式函数

发布时间:2020-12-16 09:55:35 所属栏目:安全 来源:网络整理
导读:我正在尝试在 Scala中设计DSL.为此,我想在精确的字符串上创建一个隐式函数. 我知道要为任何String创建一个隐式函数,我可以写: class StringPlus(str: String) { def some_function(): Unit = do_something}implicit def string2StringPlus(str: String) = n
我正在尝试在 Scala中设计DSL.为此,我想在精确的字符串上创建一个隐式函数.
我知道要为任何String创建一个隐式函数,我可以写:

class StringPlus(str: String) {
    def some_function(): Unit = do_something
}
implicit def string2StringPlus(str: String) = new StringPlus(str)

但我不知道如何修改它只为某些字符串创建这个隐式函数.是否可以为隐式函数赋予布尔条件,以便仅在布尔条件为真时才创建隐式函数(例如,如果字符串的长度为5或更大,如果字符串的第一个字母是字母“a”等)并不是所有的字符串?

解决方法

简短的回答

不,这是不可能的.

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

答案很长

这可能是有可能的,但包含了大量的魔术类型,在可读性和实用性方面肯定不是一个好的解决方案.

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

然后,所有字符串转换将产生适当的类型,例如,当您使用字母A添加String […]时,您将获得AString [String […]],依此类推.

看看dependent types和HList的实施.

但同样,在你的情况下,它几乎不实用.

UPD:另请参阅Refined项目,该项目提供类型级谓词.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读