Je trouve profondément bizarre que cela soit possible dans Ruby (je ne dirai pas immédiatement comment):
obj = #code redacted
print obj.state # Some value.
LValue = obj
print obj.state # Different value!
Votre défi est de créer du code à peu près de cette forme. Créez un objet et affectez-le à une variable. Il doit avoir un attribut défini (ou une méthode déterministe et idempotente) comme state
ci-dessus, qui change après que l'objet est affecté à un nouvel identifiant ( LValue
ci-dessus), même si vous utilisez toujours l'ancien identifiant ( obj
ci-dessus) pour vous y référer.
Modifier pour mettre l'accent : state
ou l'équivalent doit être idempotent, donc la création d'un accesseur qui modifie la valeur, ou pour toute autre raison renvoie des résultats différents lorsqu'il est appelé plusieurs fois de suite, n'est pas une solution valide. Ou, plus simplement, ce doit être l'affectation qui change l'état.
Toute langue avec affectation est éligible, bien qu'il y en ait probablement où il n'y a pas de solution entièrement légitime. Je publierai ma réponse Ruby si personne d'autre ne l'obtient après quelques jours et j'accepterai les réponses les plus votées sur une base continue.
la source
LValue = obj
ligne doit-elle être requise pourstate
changer réellement? (Je pourrais simplement créer une propriété en C # qui augmente à chaque fois que vous l'obtenez)(setq a (list "val")) (setq b (nconc a "val2"))
par exemple.a
finit par évaluer comme("val" . "val2")
à ce moment-là.Réponses:
C ++
C'est trivial en utilisant les bons outils.
Sortie:
la source
PHP (version de débogage,> = 5.4)
Nous utilisons refcount de l'objet dans un getter. (Donc, par l'affectation, le refcount augmente et la valeur change)
la source
C #
Deux options simples:
Ou nous pourrions simplement écrire dans la même mémoire:
la source
TeX, beaucoup plus court que les autres réponses ici
En tant que système de composition, TeX a un type "boîte", qui contient du matériel de composition. Étant donné que le cas d'utilisation le plus courant consiste à déplacer ce matériau, à le diviser, etc., plutôt qu'à en faire des copies, les boîtes sont normalement supprimées lorsqu'elles sont utilisées (ou plutôt, les variables "boîte" sont des pointeurs et un seul pointeur à la fois peut pointer à une boîte réelle en mémoire). Pas besoin de magie.
la source
C ++ 11 (Donc vous avez oublié unique_ptr / shared_ptr :-))
la source
Fortran 03
Ceci est quelque peu similaire à la réponse D d'Hugo, mais est un peu plus caché (en partie parce que qui # $% ^ connaît Fortran orienté objet)?
La sortie est
Si vous pouvez comprendre ce qui s'est passé, des points bonus vous sont accordés! Si non:
la source
PowerShell
Cela crée un objet dont la
state
propriété est le nom des variables qui pointent vers l'objet.Sortie
Remarque: cela ne fonctionne pas si l'affectation se produit dans une portée enfant.
Les sorties
la source
Perl 5
Voici une façon de le faire en Perl:
Cela produit:
Explication:
Il s'agit d'une application simple de la surcharge . Plus précisément, je surcharge l'opérateur de conversion de chaîne
""
, qui est appelé lorsque l'objet surchargé est affecté àsubstr()
(qui, oui, est une valeur légale en Perl).Il y a aussi beaucoup de variables spéciales en Perl qui stringent tout ce qui leur est assigné. Par exemple, ce qui suit fonctionne également:
Solution alternative
Voici une autre façon de procéder:
Voici
state
une méthode (nous pourrions en faire un attribut avec d'autres manigances de liaison / surcharge, mais cela compliquerait les choses) qui compte littéralement le nombre de références à l'objet. Ainsi, contrairement à la première solution, vous devez en fait assigner$obj
à une variable normale qui peut contenir une référence d'objet pour effectuer le changement d'état.la source
JavaScript
Ok, j'ai donc fait une version plus courte qui fonctionne comme SSCCE, mais n'essaie plus d'analyser correctement JavaScript, donc le comptage des références peut ne pas fonctionner lorsqu'il est placé dans un script plus complexe.
la source
Python
Ça triche un peu, mais que diriez-vous:
la source
C ++ 11
bien que cela puisse être étendu à d'autres langages qui prennent en charge les destructeurs implicites / explicites
la source
new
sans undelete
dans le programme. Bien que, pour cette tâche, c'est assez bon je pense :)cout
ligne vers le haut avant le}
et dites si cela fonctionne. :-)Scala
Les conversions implicites vous permettent d'accomplir cela lors de l'affectation à une variable locale normale:
Vous pouvez également accomplir cela avec des types inférés:
Vous pouvez également utiliser une méthode de définition personnalisée, bien que cela nécessite que la valeur L soit un champ:
la source
ré
Sortie:
la source
Rubis
Comme promis, voici la réponse qui a inspiré la question.
Class.new
crée une classe anonyme. L'appelto_s
à une classe anonyme donne la représentation sous forme de chaîne par défaut des objets, à quoi ressemble#<Class:0x007fe3b38ed958>
. Cependant, une fois que la classe a été affectée à une constante,to_s
devient cette constante. En Ruby, une constante est une variable qui commence par une lettre majuscule, doncobj
comme une référence à la classe qui lui permet de rester anonyme.Mon code encapsule
to_s
dans unestate
méthode, donc la sortie devientContrairement à la plupart des solutions ici, cela ne fonctionne qu'une seule fois: l'attribution
obj
à une autre constante ne changera pas sa représentation sous forme de chaîne, et aucune autre valeur ne sera affectée àLValue
.la source
En Java
Je pensais que c'était impossible à Java. Mais…
Classe principale:
Chat de classe:
J'ai été inspiré par @tbodt.
la source
Cat.x = 2
puis imprimerCat.x
.Cat otherCat = tom
l'État n'aurait pas changé du tout. J'ai du mal à croire que cela répond à la lettre ou à l'esprit des règles.C ++
Ce comportement est en fait spécifié dans la norme (et c'est pourquoi il est déconseillé).
Sortie
Le processus qui provoque cela est le même que la réponse d'Abhijit mais sans nécessiter de réponse
std::move
identique à celle de marinus mais en utilisant une classe standard au lieu de la définir moi-même.Edit: j'ajoute quelques explications. Dans la sortie, "une adresse" sera en fait une valeur hexadécimale pour l'adresse de l'entier alloué.
std::auto_ptr
libère son pointeur de magasins lorsqu'il est attribué à un autreauto_ptr
et définit son pointeur interne sur 0. L'appelget()
récupère l'accès au pointeur de magasins.la source
get()
? Pourquoi retournerait-il 0 à la fin?auto_ptr
est obsolète.Python
la source
Python 2.x
Je ne pouvais pas trouver un moyen approprié de le faire sans définir une classe supplémentaire.
la source
Java
Toutes les autres solutions utilisent la forme de surcharge de l'opérateur de leur langue. Java n'a pas de surcharge d'opérateur, donc je pensais que j'étais coincé. Mais j'ai trouvé quelque chose.
Voici la classe principale:
Il y a quelques lignes suspectes, mais elles ne feraient rien si la
Thing
classe était complètement normale. Ce n'est pas:Il n'est pas garanti de fonctionner à cause des threads, mais je l'ai testé sur JDK 1.8u5, et cela fonctionne là-bas.
la source
Lisp commun
Je définis l'état comme le nombre de variables spéciales liées à un vecteur. Ainsi, l'affectation à une variable spéciale change l'état.
Sortie:
Il ne fonctionne qu'avec des affectations à des variables spéciales, pas à des variables lexicales, ni à des emplacements dans un objet.
Attention, qui
do-all-symbols
regarde dans tous les packages, il manque donc des variables qui n'ont pas de package. Il peut compter deux fois les symboles qui existent dans plusieurs packages (lorsqu'un package a importé le symbole d'un autre package).Rubis
Ruby est presque le même, mais je définis l'état comme le nombre de constantes faisant référence à un tableau.
Sortie:
Ceci est une généralisation de la réponse histocrate aux objets Ruby qui ne sont pas des classes ou des modules. L'avertissement apparaît car la constante de configuration charge automatiquement le code qui a généré l'avertissement.
la source
C ++
Le résultat peut différer sur différentes plateformes. Testé sur ideone .
Sortie:
la source
C #
Sortie:
la source
=
?B
à unA
, car celaimplicit operator A(B b)
a des effets secondaires.