Как понимается оператор splat при применении к выражению диапазона? - PullRequest
2 голосов
/ 15 апреля 2020

Я обнаружил, что выражение [*1..4] возвращает то же самое, как если бы я делал (1..4).to_a, но я не понимаю синтаксис здесь. Насколько я понимаю, * является - будучи унарным оператором в данном случае - оператором , и справа от него у нас есть Range. Однако, если просто написать выражение *1..4, это синтаксическая ошибка, а *(1..4) также синтаксическая ошибка. Почему первый [*1..4] работает и как его понимать в деталях?

1 Ответ

1 голос
/ 15 апреля 2020

Сплат * преобразует объект в список значений (обычно список аргументов ), вызывая его метод to_a, поэтому *1..4 эквивалентно:

1, 2, 3, 4

Само по себе вышеприведенное недействительно. Но в квадратных скобках [*1..4] становится:

[1, 2, 3, 4]

Это действительно.

Вы также можете написать a = *1..4, что эквивалентно:

a = 1, 2, 3, 4
#=> [1, 2, 3, 4]

Здесь список значений становится массивом из-за Ruby неявного присвоения массива .

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