19

我正在尝试编写一种方法,该方法充当设置器并在分配的值之外接受一些额外的参数。愚蠢的例子:

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

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

4

2 回答 2

20

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

gen.send(:allow=, 'a', 1, false)会起作用,但此时你也可以只给方法一个不包含=.

于 2010-03-04T17:11:05.107 回答
8

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

例如:

def allow=(arguments)
  puts arguments[:letter]
  puts arguments[:position]
  puts arguments[:allowed]
end

object.allow={:letter=>'A',:position=>3,:allowed=>true}
于 2011-12-17T15:50:20.157 回答