Me resulta profundamente extraño que esto sea posible en Ruby (no diré de inmediato cómo):
obj = #code redacted
print obj.state # Some value.
LValue = obj
print obj.state # Different value!
Su desafío es crear código aproximadamente de esta forma. Cree un objeto y asígnelo a una variable. Debe tener algún atributo definido (o método determinista e idempotente) como el state
anterior, que cambia después de que el objeto se asigna a un nuevo identificador ( LValue
arriba), incluso si todavía usa el identificador obj
anterior ( arriba) para referirse a él.
Edite para enfatizar : state
o el equivalente debe ser idempotente, por lo que crear un descriptor de acceso que modifique el valor, o por cualquier otro motivo, arroje resultados diferentes cuando se lo llame varias veces seguidas, no es una solución válida. O, más simplemente, tiene que ser la asignación la que cambia el estado.
Cualquier idioma con asignación es elegible, aunque probablemente haya algunos en los que no haya una solución totalmente legítima. Publicaré mi respuesta de Ruby si nadie más la recibe después de unos días, y aceptaré las respuestas mejor votadas de forma continua.
fuente
LValue = obj
ser necesaria la línea parastate
cambiar realmente? (Podría hacer una propiedad en C # que se incremente cada vez que la obtenga)(setq a (list "val")) (setq b (nconc a "val2"))
por ejemplo.a
termina evaluando como("val" . "val2")
en ese punto.Respuestas:
C ++
Esto es trivial usando las herramientas adecuadas.
Salida:
fuente
PHP (compilación de depuración,> = 5.4)
Usamos el recuento del objeto en un captador. (Entonces, por la asignación, el recuento aumenta y los cambios de valor)
fuente
DO#
Dos opciones simples:
O simplemente podríamos escribir en la misma memoria:
fuente
TeX, mucho más corto que otras respuestas aquí
Como sistema de composición tipográfica, TeX tiene un tipo de "caja", que contiene material tipográfico. Dado que el caso de uso más común es mover este material, dividirlo, etc., en lugar de hacer copias de él, los cuadros normalmente se eliminan cuando se usan (o más bien, las variables de "cuadro" son punteros y solo un puntero a la vez puede señalar a una caja real en la memoria). No hay necesidad de magia.
fuente
C ++ 11 (Entonces ustedes se han olvidado de unique_ptr / shared_ptr :-))
fuente
Fortran 03
Esto es algo similar a la respuesta D de Hugo, pero está un poco más escondido (en parte porque ¿quién # $% ^ conoce Fortran orientado a objetos)?
La salida es
Si puedes descubrir lo que sucedió, ¡puntos extra para ti! Si no:
fuente
Potencia Shell
Esto crea un objeto cuya
state
propiedad son los nombres de las variables que apuntan al objeto.Salida
Nota: Esto no funciona si la asignación ocurre en un ámbito secundario.
Salidas
fuente
Perl 5
Aquí hay una forma de hacerlo en Perl:
Esto produce:
Explicación:
Esta es una aplicación directa de sobrecarga . Específicamente, sobrecargo el operador de conversión de cadenas
""
, que se llama cuando se asigna el objeto sobrecargadosubstr()
(que, sí, es un valor legal en Perl).También hay muchas variables especiales en Perl que stringifican cualquier cosa asignada a ellas. Por ejemplo, lo siguiente también funciona:
Solución alternativa
Aquí hay otra forma de hacerlo:
Aquí,
state
hay un método (podríamos convertirlo en un atributo con más travesuras de empate / sobrecarga, pero eso complicaría las cosas) que literalmente cuenta el número de referencias al objeto. Por lo tanto, a diferencia de la primera solución, en realidad tiene que asignar$obj
a una variable normal que puede contener una referencia de objeto para hacer que el estado cambie.fuente
JavaScript
Ok, hice una versión más corta que funciona como SSCCE, pero ya no intenta analizar JavaScript correctamente, por lo que el recuento de referencias podría no funcionar cuando se coloca dentro de un script más complejo.
fuente
Pitón
Hace trampa un poco, pero ¿qué tal:
fuente
C ++ 11
aunque esto se puede extender a otros idiomas que admitan destructores implícitos / explícitos
fuente
new
sin un solodelete
en el programa. Aunque, para esta tarea, es lo suficientemente bueno, creo :)cout
línea hacia arriba antes de}
y diga si eso funciona. :-)Scala
Las conversiones implícitas le permiten lograr esto mientras asigna a una variable local normal:
También puede lograr eso con los tipos inferidos:
También puede usar un método de establecimiento personalizado, aunque eso requiere que el valor L sea un campo:
fuente
re
Salida:
fuente
Rubí
Según lo prometido, aquí está la respuesta que inspiró la pregunta.
Class.new
crea una clase anónima Llamarto_s
a una clase anónima da la representación de cadena predeterminada de los objetos, que se ve así#<Class:0x007fe3b38ed958>
. Sin embargo, una vez que la clase ha sido asignada a una constante, seto_s
convierte en esa constante. En Ruby, una constante es una variable que comienza con una letra mayúscula, entoncesobj
es una referencia a la clase que le permite permanecer en el anonimato.Mi código se ajusta
to_s
en unstate
método, por lo que la salida se convierteA diferencia de la mayoría de las soluciones aquí, esto solo funciona una vez: asignar
obj
a otra constante no cambiará su representación de cadena, y tampoco asignará un nuevo valor aLValue
.fuente
En java
Pensé que esto era imposible en Java. Pero…
Clase principal :
Clase gato:
Me inspiré en @tbodt.
fuente
Cat.x = 2
y luego imprimeCat.x
.Cat otherCat = tom
el estado no habría cambiado en absoluto. Me cuesta creer que esto cumpla con la letra o el espíritu de las reglas.C ++
Este comportamiento se especifica realmente en el estándar (y es por eso que fue desaprobado).
Salida
El proceso que causa esto es el mismo que la respuesta de Abhijit pero sin requerir una
std::move
respuesta igual a la de marinus, pero usando una clase estándar en lugar de definirla yo mismo.Editar: estoy agregando alguna explicación. En la salida, "alguna dirección" en realidad será un valor hexadecimal para la dirección del entero asignado.
std::auto_ptr
libera su puntero de tiendas cuando se le asigna a otroauto_ptr
y establece su puntero interno en 0. Las llamadasget()
recuperan el acceso al puntero de tiendas.fuente
get()
? ¿Por qué devolvería 0 al final?auto_ptr
está en desuso.Pitón
fuente
Python 2.x
No pude encontrar una manera adecuada de hacer esto sin definir una clase adicional.
fuente
Java
Todas las demás soluciones utilizan la forma de sobrecarga del operador de su idioma. Java no tiene sobrecarga del operador, así que pensé que estaba atascado. Pero se me ocurrió algo.
Aquí está la clase principal:
Hay algunas líneas sospechosas, pero no harían nada si la
Thing
clase fuera completamente normal. No es:No se garantiza que funcione debido a los hilos, pero lo probé en JDK 1.8u5, y funciona allí.
fuente
Lisp común
Defino estado como el número de variables especiales vinculadas a un vector. Entonces, la asignación a una variable especial cambia el estado.
Salida:
Solo funciona con asignaciones a variables especiales, no a variables léxicas, ni a ranuras dentro de un objeto.
Cuidado que
do-all-symbols
ve en todos los paquetes, por lo que pierde variables que no tienen paquete. Puede contar dos símbolos que existen en más de un paquete (cuando un paquete importa el símbolo de otro paquete).Rubí
Ruby es casi lo mismo, pero defino estado como el número de constantes que se refieren a una matriz.
Salida:
Esta es una generalización de la respuesta del histocrat a los objetos Ruby que no son clases o módulos. La advertencia aparece porque la constante Config carga automáticamente algún código que hizo la advertencia.
fuente
C ++
El resultado puede diferir en diferentes plataformas. Probado en ideone .
Salida:
fuente
DO#
Salida:
fuente
=
?B
a unA
, porqueimplicit operator A(B b)
tiene efectos secundarios.