Создание метода установщика, который берет дополнительные аргументы в Ruby

Я пытаюсь записать метод, который действует как метод set и берет некоторые дополнительные аргументы помимо присвоенного значения. Глупый пример:

class WordGenerator
  def []=(letter, position, allowed)
    puts "#{letter}#{allowed ? ' now' : ' no longer'} allowed at #{position}"
  end

  def allow=(letter, position, allowed)
    # ...
  end
end

При записи этого, поскольку работает индексатор, и я могу назвать его как это:

gen = WordGenerator.new

gen['a', 1] = true
# or explicitly:
gen.[]=('a', 1, true)

Но когда я пробую любое из следующих, интерпретатор жалуется:

gen.allow('a', 1) = false # syntax error
gen.allow=('a', 1, false) # syntax error

Почему это не будет работать, я пропускаю очевидное?

18
задан Valentin Milea 4 March 2010 в 16:14
поделиться

1 ответ

Это не работает, потому что синтаксический анализатор не позволяет этого. Знак равенства разрешен в выражениях вида идентификатор = выражение , выражение.идентификатор = выражение (где идентификатор - \ w + ), выражение [ аргументы] = выражение и выражение. [] = аргументы и как часть строки, символа или символьного литерала (? = ). Вот и все.

gen.send (: allow =, 'a', 1, false) будет работать, но в этот момент вы также можете просто дать методу имя, которое не включает = .

19
ответ дан 30 November 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: