我正在尝试编写一个充当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
为什么这不起作用,我错过了显而易见的事情吗?
答案 0 :(得分:18)
它不起作用,因为解析器不允许它。表单identifier = expression
,expression.identifier = expression
(标识符为\w+
),expression[arguments] = expression
和expression.[]= arguments
以及字符串的一部分或表达式中允许使用等号或符号或字符文字(?=
)。就是这样。
gen.send(:allow=, 'a', 1, false)
可行,但此时您也可以为该方法指定一个不包含=
的名称。
答案 1 :(得分:6)
我遇到过这个并决定将我的参数作为数组或哈希传递。
E.g:
def allow=(arguments)
puts arguments[:letter]
puts arguments[:position]
puts arguments[:allowed]
end
object.allow={:letter=>'A',:position=>3,:allowed=>true}