Это потому, что, как вы подозреваете, []
также является обозначением для «создания массива», поэтому с точки зрения синтаксиса это не будет работать. Синтаксический анализатор Ruby может только допустить такую неоднозначность, прежде чем он будет вести себя непредсказуемо.
Вы должны сделать это явным вызовом метода, например self[...]
, чтобы различать два случая.
Ваше if
условие преобразуется в "если массив, содержащий position
равен 3
...".
Вы можете себе представить, что если [x]
всегда вызывал метод для self[x]
, если Вы определили []
как метод, тогда было бы очень сложно создавать массивы в этом коде.
Хотя метода {}
нет, при использовании этих фигурных скобок возникает аналогичная неоднозначность:
p { x: y } # => Syntax error, expecting block
p({ x: y }) # => Hash argument
p { x } # => Block argument