你能在小马模式匹配中解压值吗?
Can you unpack values in pony pattern matching?
Pony 可以在 类 上进行模式匹配,也可以在匹配表达式中分配结果(使用 let ... :
),但是有没有办法解压匹配表达式中的值?例如像这样的东西?
actor Main
fun f(x: (Foo | Bar)): String =>
match x
| Foo(1) => "one"
| Foo(2) => "two"
| Foo(x) => x.string() // fails
else
"Bar"
end
我能想到的唯一选择是一系列
actor Main
fun f(x: (Foo | Bar)): String =>
match x
| Foo(1) => "one"
| Foo(2) => "two"
| Bar => "Bar"
else
try
let f = x as Foo
f.number.string()
end
end
但这也不太好理解,特别是如果有多个 类 可以匹配。
我假设你有这样的伴随定义:
class Foo is (Equatable[Foo box] & Stringable)
var value: I32 = 1
new create(value': I32) => value = value'
fun box eq(other: Foo box): Bool => value == other.value
fun string(): String iso^ => value.string()
primitive Bar
然后您可以为特定类型的整个值绑定名称,如下所示:
actor Main
fun f(x: (Foo | Bar)): String =>
match x
| Foo(1) => "one"
| Foo(2) => "two"
| let x': Foo => x'.string()
else
"Bar"
end
我认为在这个特殊情况下这还不算太糟糕,但它肯定不是真正的解构绑定。 Pony 仅支持元组的这种模式,形式为 (let first: First, let second: Second)
.
Pony 可以在 类 上进行模式匹配,也可以在匹配表达式中分配结果(使用 let ... :
),但是有没有办法解压匹配表达式中的值?例如像这样的东西?
actor Main
fun f(x: (Foo | Bar)): String =>
match x
| Foo(1) => "one"
| Foo(2) => "two"
| Foo(x) => x.string() // fails
else
"Bar"
end
我能想到的唯一选择是一系列
actor Main
fun f(x: (Foo | Bar)): String =>
match x
| Foo(1) => "one"
| Foo(2) => "two"
| Bar => "Bar"
else
try
let f = x as Foo
f.number.string()
end
end
但这也不太好理解,特别是如果有多个 类 可以匹配。
我假设你有这样的伴随定义:
class Foo is (Equatable[Foo box] & Stringable)
var value: I32 = 1
new create(value': I32) => value = value'
fun box eq(other: Foo box): Bool => value == other.value
fun string(): String iso^ => value.string()
primitive Bar
然后您可以为特定类型的整个值绑定名称,如下所示:
actor Main
fun f(x: (Foo | Bar)): String =>
match x
| Foo(1) => "one"
| Foo(2) => "two"
| let x': Foo => x'.string()
else
"Bar"
end
我认为在这个特殊情况下这还不算太糟糕,但它肯定不是真正的解构绑定。 Pony 仅支持元组的这种模式,形式为 (let first: First, let second: Second)
.