El problema con el código es la variable definida en el interior number
times()
cae fuera del alcance method_missing()
. Por lo tanto, cuando se ejecuta esa línea, Ruby lo interpreta como una llamada a método en self
.
En casos normales, debería recibir la excepción NoMethodError
. Sin embargo, dado que ha reemplazado el método method_missing()
por MyClass
, no obtiene esta excepción. En cambio, hasta que se llame a la pila se desborda el método number(
).
Para evitar estos problemas, intente especificar los nombres de los métodos que están permitidos. Por ejemplo, digamos que solo necesita llamar a los métodos try, test, and my_method
en MyClass
, luego especifique estos nombres de método en method_missing()
para evitar dichos problemas.
A modo de ejemplo:
class MyClass
def method_missing(name, *args)
name = name.to_s
super unless ['try', 'test', 'my_method'].include? name
number = 0
10.times do
number = rand(100)
end
puts "#{number} and #{name}"
end
end
Si realmente no necesita method_missing()
, no lo utilice. Hay algunas buenas alternativas here.
Eres 31 segundos más rápido que yo. Pero supongo que 'puts" # # y # {name} "' se suponía que estaba dentro de los "10.times" pero quizás no. –
¡Fuiste simplemente más rápido que yo también! :) Y no pensé en agregar el bit sobre super (gran +1), pero en cuanto al número, creo que realmente quieren decir algo más como este 'number = Array.new (10) {rand (100)} .reduce (: +) ' – iain
sí, tienes razón. por el momento no tiene sentido tener times(), ya que puts no está dentro del bloque :) –