Не могу опустить `self` при использовании метода скобок в классе - PullRequest
3 голосов
/ 11 апреля 2020
  1. Я знаю, что мы можем определить [](arg) в ruby классе как метод скобок
  2. Я знаю, что мы можем опустить self. при вызове метода экземпляра внутри класса

Но следующее не сработает:

class Example

  def [](position)
    ...
  end

  def test(position)
    if [position] == 3 # doesn't work
  end

end

Я знаю, что это, вероятно, потому, что [position] может относиться к созданию массива с позицией, но документировано ли это где-нибудь?

1 Ответ

2 голосов
/ 11 апреля 2020

Это потому, что, как вы подозреваете, [] также является обозначением для «создания массива», поэтому с точки зрения синтаксиса это не будет работать. Синтаксический анализатор Ruby может только допустить такую ​​неоднозначность, прежде чем он будет вести себя непредсказуемо.

Вы должны сделать это явным вызовом метода, например self[...], чтобы различать два случая.

Ваше if условие преобразуется в "если массив, содержащий position равен 3 ...".

Вы можете себе представить, что если [x] всегда вызывал метод для self[x], если Вы определили [] как метод, тогда было бы очень сложно создавать массивы в этом коде.

Хотя метода {} нет, при использовании этих фигурных скобок возникает аналогичная неоднозначность:

p { x: y } # => Syntax error, expecting block
p({ x: y }) # => Hash argument
p { x } # => Block argument
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...