Создание метода установки, который принимает дополнительные аргументы в Ruby - PullRequest
18 голосов
/ 04 марта 2010

Я пытаюсь написать метод, который действует как установщик и принимает некоторые дополнительные аргументы помимо назначенного значения. Глупый пример:

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

Почему это не сработает, я упускаю очевидное?

Ответы [ 2 ]

19 голосов
/ 04 марта 2010

Это не работает, потому что парсер не позволяет этого. Знак равенства допускается в выражениях вида identifier = expression, expression.identifier = expression (где идентификатор равен \w+), expression[arguments] = expression и expression.[]= arguments и как часть строки, символа или символьного литерала (?=). Вот и все.

gen.send(:allow=, 'a', 1, false) будет работать, но в этот момент вы также можете просто дать методу имя, которое не содержит =.

6 голосов
/ 17 декабря 2011

Я столкнулся с этим и решил передать свои аргументы в виде массива или хэша.

например:.

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

object.allow={:letter=>'A',:position=>3,:allowed=>true}
...