Почему coffeescript требует скобок здесь? - PullRequest
0 голосов
/ 24 января 2020

Посмотрите на следующие фрагменты:

if a
  return

if a b
  return

if (a b)
  return

if a(b)
  return

if a((b) -> c)
  return

if (a (b) -> c)
  return

if a (b) -> c
  return

Последний не скомпилируется и выдаст вводящее в заблуждение сообщение об ошибке, unexpected if. Я ожидаю, что он выдаст тот же результат, что и два предыдущих.

Почему это не разрешено?

1 Ответ

1 голос
/ 27 января 2020

В последнем примере есть неоднозначность, является ли возвращение частью функции или оператора if. Если он интерпретируется как часть функции, то это будет синтаксическая ошибка, поскольку для оператора if нет тела.

if a (b) -> c
  return

Может быть интерпретировано так, как вы ожидали:

if (a (b) -> c)
  return

Или отступ return понимается как продолжение анонимной функции:

if (a (b) -> c
  return)

В этом случае он выдает ошибку, поскольку в go с оператором if нет тела.

Я не уверен, но я предполагаю, что он решает поместить return внутри функции, так как это ближайший контекст, и он не был явно закрыт (например, с круглыми скобками).

В качестве альтернативы, достаточно безопасно использовать круглые скобки, как у вас, так как это приведет к ошибке компиляции, а не к непредвиденному поведению, которое будет трудно отладить.

Если все, что вы Если вы делаете return внутри оператора if, вы можете использовать трейлинг if:

return if a (b) -> c

Или сначала выполнить функцию, а затем использовать результат в операторе if, чтобы сделать его более подробным:

* 102 3 *
...