Создание метода setter, который принимает дополнительные аргументы в Ruby
Я пытаюсь написать метод, который действует как сеттер, и принимает дополнительные аргументы, кроме назначенного значения. Глупый пример:
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
Почему это не будет работать, я пропущу очевидное?
Ответы
Ответ 1
Это не работает, потому что парсер этого не допускает. Знак равенства разрешен в выражениях формы identifier = expression
, expression.identifier = expression
(где идентификатор \w+
), expression[arguments] = expression
и expression.[]= arguments
и как часть строки или символа или символьного литерала (?=
). Что это.
gen.send(:allow=, 'a', 1, false)
будет работать, но в этот момент вы могли бы просто дать методу имя, которое не включает =
.
Ответ 2
Я столкнулся с этим и решил передать свои аргументы как массив или хэш.
например:.
def allow=(arguments)
puts arguments[:letter]
puts arguments[:position]
puts arguments[:allowed]
end
object.allow={:letter=>'A',:position=>3,:allowed=>true}