2012-03-17 12 views
6
class MyClass 
    def method_missing(name, *args) 
    name = name.to_s 
    10.times do 
     number = rand(100) 
    end 
    puts "#{number} and #{name}" 
    end 
end 

Hola, estoy ejercitando ruby ​​pero en esta función no recursiva estoy obteniendo un nivel de error demasiado profundo cuando uso este fragmento de código.Nivel de pila demasiado profundo en Ruby

x = MyClass.New 
x.try 

Respuesta

11

El problema con el código es la variable definida en el interior numbertimes() 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.

+1

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. –

+1

¡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

+0

sí, tienes razón. por el momento no tiene sentido tener times(), ya que puts no está dentro del bloque :) –

Cuestiones relacionadas