У вас есть (как минимум) три варианта.
Во-первых, вы можете включить, что в случае:
case Expr ee:binaryOperation(Expr e1:scalar(_), Expr e2, Op opern) :
В этом случае вам будет нужен второй, более общий случай для того, когда e1
не scalar
:
case Expr ee:binaryOperation(Expr e1, Expr e2, Op opern) :
Это должен быть ниже первого. Я не большой поклонник упорядочивания зависимостей, поэтому это не решение, которое я бы использовал.
Во-вторых, вы можете сопоставить это с вашим условным. Это соответствует, если это scalar
:
if(scalar(_) := e1)
и это соответствует, если это не так:
if(scalar(_) !:= e1)
Если вам нужно содержание - значение внутри scalar
- вы хотели бы поставить переменной, чтобы связать его в матче.
В-третьих, вы можете использовать is
оператор:
if(e1 is scalar)
или
if (!(e1 is scalar))
позволит вам проверить e1
есть, или нет, построена с использованием scalar
. Оператор is
действительно говорит, что «главный конструктор для e1
- это scalar
», и если это все, что вам нужно знать, это проще, чем писать совпадение.
спасибо! настолько очевидным и все же неуловимым. Я продолжал писать, если (e1: = scalar (_)), но я не думаю, что это сработало. Почему упорядочение e1 и скаляра важно во время сопоставления с образцом, или это так? –
Один способ подумать о сопоставлении с образцом - более общая форма назначения. В выражении/выражении присваивания на большинстве языков вы также записываете получающее выражение слева и производящее выражение справа. То же самое с оператором сопоставления шаблонов: шаблон слева, значение справа. Сторона значения вычисляет/строит новые значения, а шаблон связывает/деконструирует их. Примеры: 'a: = 1',' : = <1,2> ',' (str name) (a, b): = f (1,2) ' – jurgenv
спасибо, но расширяя обсуждение, то, что тогда принципиально отличается между присвоение и привязка шаблонов? –