Можете ли вы распаковать значения при сопоставлении с пони? - PullRequest
0 голосов
/ 09 сентября 2018

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

Но это также не читается, особенно если есть несколько возможных классов для сопоставления.

1 Ответ

0 голосов
/ 02 октября 2018

Полагаю, у вас есть следующие определения:

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).

...