创建一个在Ruby中获取额外参数的setter方法

我正在尝试编写一个充当setter的方法,除了赋值之外还需要一些额外的参数。 愚蠢的例子:

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 

为什么这不起作用,我错过了显而易见的事吗?

它不起作用,因为解析器不允许它。 forms为identifier = expressionexpression.identifier = expression (其中identifier为\w+ ), expression[arguments] = expressionexpression.[]= arguments以及作为字符串或符号或字符的一部分的表达式中允许使用等号expression.[]= arguments文字( ?= )。 而已。

gen.send(:allow=, 'a', 1, false)可以工作,但是在那时你也可以给这个方法一个不包含a的名字。

我遇到过这个并决定将我的参数作为数组或哈希传递。

例如:

 def allow=(arguments) puts arguments[:letter] puts arguments[:position] puts arguments[:allowed] end object.allow={:letter=>'A',:position=>3,:allowed=>true}