2010-11-23 16 views
30

Estoy tratando de completar el segundo ejercicio el día 2 de IO en el libro Siete idiomas en siete días. En ella, tu preguntó: “¿Cómo cambiaría/a devolver 0 si el denominador es cero?” He determinado que puedo agregar un método a utilizar Número:¿Cómo se reemplazan los operadores existentes sin invocarlos en Io?

Number new_div := method(i, if(i != 0, self/i, 0)) 

lo que no estoy seguro de cómo es para reemplazar el "/" en la tabla del operador. He intentado:

Number/:= Number new_div 
Number/:= self new_div 

Pero consigo una excepción a la vez, ya que está tratando de invocar “/”. ¿Cómo puedo manejar el Número/para que pueda almacenar una referencia al método anterior y luego redefinirlo para mis propios fines? ¿Me estoy equivocando?

+0

Estoy tratando de resolver el mismo problema. Hago "Number /: = method (...)". Y estoy atrapado con el mismo bucle infinito que jer señaló. No puedo encontrar una manera de preservar la implementación original de/y llamarlo. –

+0

@Eric Hogue: No publiqué mi respuesta porque * jer * ¡simplemente me gané! Lo publiqué ahora porque muestra cómo preservar la división original y evitar el ciclo de recursión. – draegtun

Respuesta

39

Por Eric Hogue (ver pregunta comentarios):

origDiv := Number getSlot("/") 

10 origDiv(5) println # => 2 
10 origDiv(0) println # => inf 

Number/:= method (i, 
    if (i != 0, self origDiv(i), 0) 
) 

(10/5) println  # => 2 
(10/0) println  # => 0 
+0

Gracias. Esto es más o menos lo que estaba haciendo, excepto que estaba tratando de hacer autodivi i. Sin los paréntesis. –

+2

Hubiera esperado que la solución involucrara la tabla del operador. Gracias por esta respuesta. – dpurrington

4

Lo que se quiere hacer es ejecutar:

Number setSlot("/", Number getSlot("new_div") 

Por ejemplo.

Sin embargo, cabe señalar, que tendrá un bucle infinito en sus manos si utiliza esa definición de new_div, ya que está llamando el método / dentro de ella, y el establecimiento del operador / utilizar new_div causará la llamada a, 6/2 para repetir hasta que se quede sin memoria.

+1

¿Cómo ayuda eso? Aún tendrás un bucle infinito. – TrueWill

+0

¿Has leído lo que escribí? Explico explícitamente el potencial de un ciclo infinito. – jer

+1

No hay "potencial" aquí. ** Tendrá ** un bucle infinito a menos que vaya por la ruta de Johan y vuelva a implementar la división o vaya a la ruta de @ draegtun y guarde la implementación original. Y te falta un paréntesis de cierre. Las otras respuestas proporcionan implementaciones completas, que su respuesta no. – TrueWill

4

Lo que si se ha utilizado el operador de energía dentro de su redefinición, entonces usted no tiene que mantener una referencia al antiguo operador de división.

Number/:= method(i, if(i==0, 0, self*i**(-1))) 
+2

Eso supone que el comportamiento anterior es el comportamiento predeterminado. Alguien más puede haberlo cambiado. Sea un buen ciudadano, siempre busque el comportamiento actual cuando quiera reemplazarlo. :) – jer

Cuestiones relacionadas