Насколько важны пробелы внутри паренов в Ruby? - PullRequest
2 голосов
/ 03 июня 2019

Я только что обнаружил, что пробел внутри паренов может иметь значение в Ruby неожиданным образом: Вот 3 функции, которые выглядят семантически идентичными для меня:

def foo(x)
     return {
      :a => (x - 100),
    }
end

def bar(x)
     return {
       :a => (x
              - 100),
    }
end

def zot(x)
     return {
       :a => (x -
              100),
    }
end

Однако foo(10) и zot(10) возвращают {:a=>-90} (как я и ожидал), в то время как bar(10) возвращает {:a=>-100} (к моему ужасу и разочарованию).

Что мне здесь не хватает?

Ответы [ 2 ]

8 голосов
/ 03 июня 2019

Это необычный случай, но я думаю, что вы видите, как Руби интерпретирует это как несколько последовательных утверждений , а не как одно утверждение.Как он видит это как:

x    # Statement 1
-100 # Statement 2

Где результат этого блока кода -100.

В случае zot вы выразили намерение продолжитьна следующей строке имеется висячий двоичный оператор -:

x - # Statement 1
100 # Statement 1 (cont)

Стоит отметить, что этого нельзя делать при вызове метода:

zot(x
 -100  # Syntax error
)

Как вв этом случае правила синтаксиса аргументов намного строже.Внутри структуры (...) свободной формы у вас значительно больше широты.

4 голосов
/ 03 июня 2019

В Ruby есть два возможных разделителя выражений: точка с запятой ; и символ новой строки.

Итак,

a
b

совпадает с

a; b

Это означает, что

a
- b

совпадает с

a; - b

, что совпадает с

a; b.-@()

Конечно, вы ожидали, что оно будет эквивалентно

a - b

, что совпадает с

a.-(b)

Дело в том, что каждая из этих двух интерпретаций одинаково действительна.Разработчик языка должен выбрать одну из этих двух интерпретаций, и в этом случае они выбрали первую.Ни один из них не является более «правильным» или более «правильным».

Если бы они выбрали второе толкование, вы бы не задали этот вопрос, но кто-то другой задал бы противоположный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...