2010-05-05 14 views
8

Esta es una pregunta teórica: ¿es posible cambiar el comportamiento de FalseClass para que actúe como TrueClass? Es posible sobrescribir to_s, xor, &, | comportamiento, pero eso no es suficiente.Hacer que FalseClass se comporte como TrueClass con programación meta

Si te gusta Test Driven Desarrollo, seguir la sugerencia de mi colega:

puts "false is new true!" if false 
puts "never happens" if true 

assert false 

afirma no va a funcionar, ¿verdad? ¿Es posible pasar la prueba con éxito?

+0

Me recuerda a la ofuscación del código C ... http://www.ioccc.org/ – Lucero

+0

He estado desarrollando una aplicación durante años y ahora creo que funciona incorrectamente, así que solo quiero hacerlo bien invirtiendo Lógicas primarias –

+0

No hay afirmación en su prueba :( – shingara

Respuesta

9

No es posible. Una forma de pensar es que no hay ningún método Object#truthiness? que pueda redefinirse.

en Ruby MRI, la prueba truthiness es el RTEST macro que está cableado a significar cualquier cosa pero Qfalse y Qnil, las dos constantes correspondiente a false y nil. Tendría que cambiar esto para redefinir qué es "verídico" o no.

2

Es imposible, al menos en la implementación oficial de Ruby, ya que la lógica verdadera y falsa es profunda en las partes C (Qtrue y Qfalse). Sin embargo, hacer pasar la afirmación funcionaría al sobrescribir assert. Además, podría usar algo como ruby2ruby para analizar todos los valores, pero de cierto todavía no se comportaría como falso y las declaraciones como ![] seguirían siendo verdaderas. También tenga en cuenta que todos los demás objetos también se comportan como verdaderos en declaraciones if y similares.

+0

Con oficial Implementación de Ruby, estás hablando de MRI/YARV, ¿verdad? –

+0

Sí. En Maglev puedes usar 'become' de Smalltalk. –

Cuestiones relacionadas