Я пытаюсь записать метод, который действует как метод 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
Почему это не будет работать, я пропускаю очевидное?
Это не работает, потому что синтаксический анализатор не позволяет этого. Знак равенства разрешен в выражениях вида идентификатор = выражение
, выражение.идентификатор = выражение
(где идентификатор - \ w +
), выражение [ аргументы] = выражение
и выражение. [] = аргументы
и как часть строки, символа или символьного литерала (? =
). Вот и все.
gen.send (: allow =, 'a', 1, false)
будет работать, но в этот момент вы также можете просто дать методу имя, которое не включает =
.