permit - routes in ruby on rails
Creando un método setter que toma argumentos extra en Ruby (2)
Estoy tratando de escribir un método que actúe como definidor y tome algunos argumentos adicionales además del valor asignado. Ejemplo tonto:
class WordGenerator
def []=(letter, position, allowed)
puts "#{letter}#{allowed ? '' now'' : '' no longer''} allowed at #{position}"
end
def allow=(letter, position, allowed)
# ...
end
end
Escribirlo como un indexador funciona y puedo llamarlo así:
gen = WordGenerator.new
gen[''a'', 1] = true
# or explicitly:
gen.[]=(''a'', 1, true)
Pero cuando intento alguno de los siguientes, el intérprete se queja:
gen.allow(''a'', 1) = false # syntax error
gen.allow=(''a'', 1, false) # syntax error
¿Por qué no funciona esto, me estoy perdiendo lo obvio?
Me he encontrado con esto y decidí pasar mis argumentos como una matriz o hash.
P.ej:
def allow=(arguments)
puts arguments[:letter]
puts arguments[:position]
puts arguments[:allowed]
end
object.allow={:letter=>''A'',:position=>3,:allowed=>true}
No funciona porque el analizador no lo permite. Se permite un signo igual en las expresiones del identifier = expression
forma identifier = expression
, expression.identifier = expression
(donde el identificador es /w+
), expression[arguments] = expression
y expression.[]= arguments
y como parte de una cadena, símbolo o carácter literal ( ?=
). Eso es.
gen.send(:allow=, ''a'', 1, false)
funcionaría, pero en ese punto también podrías darle al método un nombre que no incluya a =
.