【问题标题】:Runtime exception in syntax like defining two vals with identical names语法中的运行时异常,例如定义两个具有相同名称的 val
【发布时间】:2013-11-07 19:40:09
【问题描述】:

在某本书中,我有类似这样的代码:

object ValVarsSamples extends App {

  val pattern = "([ 0-9] +) ([ A-Za-z] +)". r   // RegEx

  val pattern( count, fruit) = "100 Bananas"
}

这应该是一个技巧,它应该为两个 val 定义相同的名称,但事实并非如此。

所以,这会失败并出现异常。

问题:这可能是关于什么的? (那应该是什么?)为什么它不起作用?

-- 正如我首先了解的那样: val 模式 - 指的是 RegEx 构造函数。在第二个 val 中,我们试图使用这样的语法传递参数?只是放一个字符串

【问题讨论】:

    标签: scala syntax


    【解决方案1】:

    这是一个提取器:

    val pattern( count, fruit) = "100 Bananas"
    

    这段代码是等价的

    val res = pattern.unapplySeq("100 Bananas")
    count = res.get(0)
    fruit = res.get(1)
    

    【讨论】:

    • 我不满意的是:“val”它看起来很像我定义了一个新值。当匹配情况下发生 unapply 时,就可以了
    【解决方案2】:

    问题是你的正则表达式不匹配,你应该把它改成:

    val pattern = "([ 0-9]+) ([ A-Za-z]+)". r
    

    [ A-Za-z] + 中 + 之前的空格表示您正在匹配 [ A-Za-z] 类中的单个字符,然后是至少一个空格字符。 [ 0-9] + 也有同样的问题。

    Scala 正则表达式定义了一个提取器,它返回正则表达式中匹配组的序列。您的正则表达式定义了两个组,因此如果匹配成功,则序列将包含两个元素。

    【讨论】:

    • 啊.. 即使是这样:“([0-9]+)([A-Za-z]+)”。删除空格..好的。你能解释一下这种 val-repeating 的语法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 2020-10-23
    • 1970-01-01
    • 2014-07-17
    • 1970-01-01
    • 2014-03-11
    • 2014-11-12
    相关资源
    最近更新 更多