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 = expressionexpression.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 に答える