Uważam za głęboko dziwne, że jest to możliwe w Ruby (nie od razu powiem jak):
obj = #code redacted
print obj.state # Some value.
LValue = obj
print obj.state # Different value!
Twoim wyzwaniem jest stworzenie kodu z grubsza z tej formy. Utwórz obiekt i przypisz go do zmiennej. Powinien mieć określony atrybut (lub deterministyczną, idempotentną metodę), jak state
wyżej, który zmienia się po przypisaniu obiektu do nowego identyfikatora ( LValue
powyżej), nawet jeśli nadal używasz starego identyfikatora ( obj
powyżej), aby się do niego odwoływać.
Edytuj dla wyróżnienia : state
lub odpowiednik musi być idempotentny, więc utworzenie akcesora, który modyfikuje wartość, lub z jakiegokolwiek innego powodu zwraca różne wyniki, gdy jest wywoływany kilka razy z rzędu, nie jest prawidłowym rozwiązaniem. Lub, mówiąc prościej, musi to być zadanie, które zmienia stan.
Każdy język z przypisaniem jest kwalifikowalny, chociaż prawdopodobnie istnieją takie, w których nie ma w pełni uzasadnionego rozwiązania. Opublikuję moją odpowiedź Ruby, jeśli nikt inny nie dostanie jej po kilku dniach, i będę przyjmować odpowiedzi o najwyższym głosowaniu na bieżąco.
źródło
LValue = obj
linia musi być wymaganastate
do faktycznej zmiany? (Mógłbym po prostu stworzyć właściwość w języku C #, która zwiększa się za każdym razem, gdy ją zdobędziesz)(setq a (list "val")) (setq b (nconc a "val2"))
na przykład.a
kończy się tak jak("val" . "val2")
w tym momencie.Odpowiedzi:
C ++
Jest to banalne przy użyciu odpowiednich narzędzi.
Wydajność:
źródło
PHP (kompilacja debugowania,> = 5,4)
Używamy przeliczania obiektu w getterze. (Tak więc, zgodnie z przypisaniem, wzrost kont i zmiany wartości)
źródło
DO#
Dwie proste opcje:
Lub możemy po prostu napisać w tej samej pamięci:
źródło
TeX, znacznie krótszy niż inne odpowiedzi tutaj
Jako system składu, TeX ma typ „box”, który zawiera materiał składu. Ponieważ najczęstszym przypadkiem użycia jest przenoszenie tego materiału, dzielenie go itp., Zamiast tworzenia kopii, ramki są zwykle usuwane po użyciu (lub raczej zmienne „box” są wskaźnikami i tylko jeden wskaźnik na raz może wskazywać do rzeczywistej skrzynki w pamięci). Nie potrzeba żadnej magii.
źródło
C ++ 11 (Więc zapomnieliście o Unique_ptr / shared_ptr :-))
źródło
Fortran 03
Jest to nieco podobne do odpowiedzi Hugo D, ale jest nieco bardziej ukryte (częściowo dlatego, że kto # $% ^ zna Objectran zorientowany Fortran)?
Dane wyjściowe to
Jeśli możesz dowiedzieć się, co się stało, zdobądź punkty bonusowe! Jeśli nie:
źródło
PowerShell
Spowoduje to utworzenie obiektu, którego
state
właściwością są nazwy zmiennych wskazujących na obiekt.Wydajność
Uwaga: To nie działa, jeśli przypisanie odbywa się w zasięgu potomnym.
Wyjścia
źródło
Perl 5
Oto jeden ze sposobów, aby to zrobić w Perlu:
To daje:
Wyjaśnienie:
Jest to proste zastosowanie przeciążenia . W szczególności przeciążam operator konwersji ciągów
""
, który jest wywoływany, gdy przypisany jest przeciążony obiektsubstr()
(co, tak, jest to prawna wartość w Perlu).Istnieje również wiele specjalnych zmiennych w Perlu, które określają wszystko, co jest do nich przypisane. Na przykład działa również:
Alternatywne rozwiązanie
Oto inny sposób:
Oto
state
metoda (moglibyśmy uczynić ją atrybutem z dalszymi shenaniganami wiążącymi / przeciążającymi, ale to by skomplikowało rzeczy), która dosłownie liczy liczbę referencji do obiektu. Zatem, inaczej niż w pierwszym rozwiązaniu, faktycznie musisz przypisać$obj
do normalnej zmiennej, która może zawierać odwołanie do obiektu, aby zmienić stan.źródło
JavaScript
Ok, więc stworzyłem krótszą wersję, która działa jako SSCCE, ale nie próbuje już poprawnie parsować JavaScript, więc zliczanie referencji może nie działać po umieszczeniu w bardziej złożonym skrypcie.
źródło
Pyton
To trochę oszukuje, ale co powiesz na:
źródło
C ++ 11
chociaż można to rozszerzyć na inne języki, które obsługują ukryte / jawne destruktory
źródło
new
bez jednegodelete
w programie. Chociaż do tego zadania wydaje mi się, że jest wystarczająco dobry :)cout
linię w górę przed}
i powiedz, czy to działa. :-)Scala
Konwersje niejawne pozwalają to osiągnąć podczas przypisywania do normalnej zmiennej lokalnej:
Możesz to zrobić również na podstawie wnioskowanych typów:
Możesz także użyć niestandardowej metody ustawiającej, chociaż wymaga to, aby wartość L była polem:
źródło
re
Wydajność:
źródło
Rubin
Zgodnie z obietnicą, oto odpowiedź, która zainspirowała pytanie.
Class.new
tworzy anonimową klasę. Wywołanieto_s
anonimowej klasy daje domyślną reprezentację ciągu obiektów, która wygląda#<Class:0x007fe3b38ed958>
. Jednak po przypisaniu klasy do stałejto_s
staje się ona stała. W Ruby stała jest zmienną, która zaczyna się od dużej litery, więcobj
jak odwołanie do klasy, która pozwala zachować anonimowość.Mój kod jest zawijany
to_s
wstate
metodzie, więc wynik staje sięW przeciwieństwie do większości rozwiązań tutaj, działa to tylko raz: przypisanie
obj
do innej stałej nie zmieni jej reprezentacji łańcuchowej i żadna z nich nie przypisze nowej wartościLValue
.źródło
W Javie
Myślałem, że to niemożliwe w Javie. Ale…
Główna klasa:
Klasa Cat:
Inspiruje mnie @tbodt.
źródło
Cat.x = 2
drukowaniaCat.x
.Cat otherCat = tom
stan w ogóle by się nie zmienił. Trudno mi uwierzyć, że jest to zgodne z literą lub duchem zasad.C ++
To zachowanie jest faktycznie określone w standardzie (i dlatego zostało wycofane).
Wydajność
Proces, który to powoduje, jest taki sam jak odpowiedź Abhijita, ale nie wymaga odpowiedzi
std::move
takiej samej jak odpowiedź marinusa, ale używa standardowej klasy zamiast definiować ją sam.Edycja: Dodaję wyjaśnienie. Na wyjściu „jakiś adres” będzie w rzeczywistości wartością szesnastkową dla adresu przydzielonej liczby całkowitej.
std::auto_ptr
zwalnia wskaźnik sklepów po przypisaniu do innegoauto_ptr
i ustawia wskaźnik wewnętrzny na 0. Wywołanieget()
pobiera dostęp do wskaźnika sklepów.źródło
get()
? Dlaczego zwraca 0 na końcu?auto_ptr
jest przestarzały.Pyton
źródło
Python 2.x
Nie mogłem znaleźć odpowiedniego sposobu na zrobienie tego bez zdefiniowania dodatkowej klasy.
źródło
Jawa
Wszystkie pozostałe rozwiązania wykorzystują formę przeciążenia operatora w ich języku. Java nie ma przeciążenia operatora, więc pomyślałem, że utknąłem. Ale coś wymyśliłem.
Oto główna klasa:
Jest kilka podejrzanych linii, ale nie zrobiliby nic, gdyby
Thing
klasa była całkowicie normalna. To nie jest:Nie ma gwarancji, że zadziała z powodu wątków, ale przetestowałem go na JDK 1.8u5 i tam działa.
źródło
Common Lisp
Stan definiuję jako liczbę zmiennych specjalnych związanych z wektorem. Tak więc przypisanie do specjalnej zmiennej zmienia stan.
Wydajność:
Działa tylko z przypisaniami do zmiennych specjalnych, nie do zmiennych leksykalnych, ani do szczelin w obiekcie.
Uważaj na to
do-all-symbols
przegląda wszystkie pakiety, więc pomija zmienne, które nie mają pakietu. Może podwójnie policzyć symbole, które istnieją w więcej niż jednym pakiecie (gdy jeden pakiet importuje symbol z innego pakietu).Rubin
Ruby jest prawie taki sam, ale definiuję stan jako liczbę stałych odnoszących się do tablicy.
Wydajność:
Jest to uogólnienie odpowiedzi histocrata na obiekty Ruby, które nie są klasami ani modułami. Ostrzeżenie pojawia się, ponieważ stała Config automatycznie ładuje kod, który utworzył ostrzeżenie.
źródło
C ++
Wynik może się różnić na różnych platformach. Testowany na ideonie .
Wydajność:
źródło
DO#
Wydajność:
źródło
=
?B
naA
, ponieważimplicit operator A(B b)
ma skutki uboczne.