- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Swift 文档学习 Swift 5.1 中的递归枚举。
这是一个代码。
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
func evaluate(_ expression: ArithmeticExpression) -> Int {
switch expression {
case let .number(value):
return value
case let .addition(left, right):
return evaluate(left) + evaluate(right)
case let .multiplication(left, right):
return evaluate(left) * evaluate(right)
}
}
}
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))
print(ArithmeticExpression.evaluate(product))
我认为最后一行代码出了问题。
这是什么意思?
最佳答案
evaluate(_:)
是 ArithmeticExpression
的一个实例函数,即你必须在上调用它ArithmeticExpression
的实例(该实例是 self
所指的)。 evaluate(_:)
的类型是 (ArithmeticExpression) -> Int
。
Swift 允许你调用类型的实例函数。您得到的是一个未绑定(bind)的实例函数。也就是说,一个函数还没有值绑定(bind)为其 self
值。这就是您在单独运行 ArithmeticExpression.evaluate
时所做的事情。您返回的未绑定(bind)实例函数具有以下类型:
(ArithmeticExpression) -> (ArithmetricExpression) -> Int
// ^--- the "self" ^--- the "expression" param ^--- the final return value.
通过调用它并提供 product
作为参数 (ArithmeticExpression.evaluate(product)
),您得到的是 (ArithmeticExpression) 类型的函数-> 整数
。此函数是一个绑定(bind)实例函数,即 self
现在已绑定(bind)(它现在具有 product
的值),但正在等待调用再一次,将另一个 ArithmeticExpression
作为参数。
有两种方法可以解决这个问题以达到你想要的效果:
要么将其设为静态函数。静态函数不是在实例上调用的,而是直接在类型上调用的,就像您尝试做的那样:
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
// Make it static here
static func evaluate(_ expression: ArithmeticExpression) -> Int {
switch expression {
case let .number(value):
return value
case let .addition(left, right):
return evaluate(left) + evaluate(right)
case let .multiplication(left, right):
return evaluate(left) * evaluate(right)
}
}
}
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))
print(ArithmeticExpression.evaluate(product))
将 evaluate
保留为实例函数,但直接在您要评估的实例上调用它,而不是在类型上调用。由于 self
是您感兴趣的表达式,因此您不再需要 expression
参数:
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
func evaluate() -> Int {
switch self {
case let .number(value):
return value
case let .addition(left, right):
return left.evaluate() + right.evaluate()
case let .multiplication(left, right):
return left.evaluate() * right.evaluate()
}
}
}
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))
print(product.evaluate())
我会说这可能是更“惯用”的版本。
关于swift - Swift 5.1 中的递归枚举问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60971778/
我是一名优秀的程序员,十分优秀!