【问题标题】:Pattern variable binding cannot appear in an expression模式变量绑定不能出现在表达式中
【发布时间】:2014-06-05 03:27:49
【问题描述】:

我一直在看苹果提供的 The Swift Programming Language guide。 以下示例来自本书:

class HTMLElement {
    let name :String;
    let text: String?;

    @lazy var asHTML : () -> String = {
        if let text = self.text {
            return "<\(self.name)>\(self.text)</\(self.name)>";
        } else {
            return "<\(self.name) />"
        }
    }
}

我错误地将闭包写成如下:

    @lazy var asHTML : () -> String = {
        if (let text = self.text) {
            return "<\(self.name)>\(self.text)</\(self.name)>";
        } else {
            return "<\(self.name) />"
        }
    }

注意let text = self.text 周围的括号,编译器抱怨:

模式变量绑定不能出现在表达式中

只是想知道Pattern Variable Binding 是什么意思,为什么它不能出现在表达式中?

【问题讨论】:

  • 在其他语言中这样做有意义吗?我不这么认为,例如if( var name='CjCoax'){ console.log('you will notreach here') }。它的 javascript 示例,但很好地解释了你想要做什么
  • @cjcoax 在您的代码中展示了与 Objective-C 和 swift 的几个不同之处:1) ';'不需要,尽管编译器会安全地忽略它们。 2) 不需要括号(或者在这种情况下,允许在流控制语句中使用

标签: swift


【解决方案1】:

“模式变量绑定”是您正在做的事情,即在某些代码中间使用let,而不是在文件或枚举或结构或类的顶层作为声明常量的方式变量。

使它成为表达式的是括号。您已将“let”表达式与其周围环境隔开,并要求将其作为表达式单独进行评估。但你不能那样做:你不能随便说“让”。

另一种看待它的方式很简单:if let 是一个固定的有意义的模式,其中条件是一个 Optional 被评估为一个常量以在 if 代码中使用。括号打破了模式。

该模式被称为绑定,因为您是在本地非常临时地定义此名称,即仅在 if 代码中定义。我认为它可以追溯到 LISP(至少,这是我过去以这种方式使用“let”的地方)。

【讨论】:

  • 是的。去掉括号,它是完全有效的。
  • 如果你来自 Ruby 或类似的语言,失去“括号”习惯是很容易的。 :)
  • 我看不到let 声明而不考虑方案;)
  • @aruisdante 是的,当我说 LISP 时,想想 Scheme;效果是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多