Saya merasa sangat aneh bahwa ini dimungkinkan di Ruby (saya tidak akan langsung mengatakan caranya):
obj = #code redacted
print obj.state # Some value.
LValue = obj
print obj.state # Different value!
Tantangan Anda adalah membuat kode secara kasar dari formulir ini. Buat objek dan tetapkan ke variabel. Seharusnya memiliki beberapa atribut yang didefinisikan (atau deterministik, metode idempoten) seperti di state
atas, yang berubah setelah objek ditugaskan ke pengidentifikasi baru (di LValue
atas), bahkan jika Anda masih menggunakan pengidentifikasi lama (di obj
atas) untuk merujuk padanya.
Edit untuk penekanan : state
atau yang setara harus idempoten, jadi membuat accessor yang mengubah nilai, atau karena alasan lain mengembalikan hasil yang berbeda ketika dipanggil beberapa kali berturut-turut, bukan solusi yang valid. Atau, lebih sederhana, itu harus menjadi tugas yang mengubah status.
Bahasa apa pun dengan tugas memenuhi syarat, meskipun mungkin ada beberapa di mana tidak ada solusi yang sepenuhnya sah. Saya akan memposting jawaban Ruby saya jika tidak ada orang lain yang mendapatkannya setelah beberapa hari, dan menerima jawaban dengan suara terbanyak secara bergulir.
sumber
LValue = obj
garis diperlukan untukstate
benar-benar berubah? (Saya hanya bisa membuat properti di C # yang bertambah setiap kali Anda mendapatkannya)(setq a (list "val")) (setq b (nconc a "val2"))
misalnya.a
akhirnya mengevaluasi("val" . "val2")
pada saat itu.Jawaban:
C ++
Ini sepele menggunakan alat yang tepat.
Keluaran:
sumber
PHP (debug build,> = 5.4)
Kami menggunakan refcount objek dalam pengambil. (Jadi, berdasarkan penugasan, kenaikan jumlah meningkat dan perubahan nilai)
sumber
C #
Dua opsi sederhana:
Atau kita bisa menulis ke memori yang sama:
sumber
TeX, jauh lebih pendek daripada jawaban lain di sini
Sebagai sistem pengaturan huruf, TeX memiliki tipe "kotak", yang berisi bahan huruf. Karena kasus penggunaan yang paling umum adalah memindahkan materi ini, membaginya, dll. Daripada membuat salinannya, kotak biasanya dihapus ketika digunakan (atau lebih tepatnya, variabel "kotak" adalah pointer dan hanya satu pointer pada satu waktu yang dapat menunjukkan ke kotak aktual di memori). Tidak perlu sihir apa pun.
sumber
C ++ 11 (Jadi kalian lupa tentang unique_ptr / shared_ptr :-))
sumber
Fortran 03
Ini agak mirip dengan jawaban Hugo D, tetapi sedikit lebih tersembunyi (sebagian karena siapa # $% ^ yang tahu Object Oriented Fortran)?
Outputnya adalah
Jika Anda dapat mengetahui apa yang terjadi, bonus menunjukkan kepada Anda! Jika tidak:
sumber
PowerShell
Ini menciptakan objek yang
state
propertinya adalah nama-nama variabel yang menunjuk ke objek.Keluaran
Catatan: Ini tidak berfungsi jika tugas terjadi dalam lingkup anak.
Keluaran
sumber
Perl 5
Inilah salah satu cara untuk melakukannya di Perl:
Output ini:
Penjelasan:
Ini adalah aplikasi overloading secara langsung . Secara khusus, saya membebani operator konversi string
""
, yang dipanggil ketika objek kelebihan ditugaskan untuksubstr()
(yang, ya, adalah nilai hukum di Perl).Ada juga banyak variabel khusus di Perl yang meringkas apa pun yang ditugaskan padanya. Misalnya, berikut ini juga berfungsi:
Solusi alternatif
Inilah cara lain untuk itu:
Di sini,
state
adalah metode (kita bisa menjadikannya atribut dengan ikatan lebih lanjut / beban berlebihan, tapi itu akan mempersulit hal-hal) yang secara harfiah menghitung jumlah referensi ke objek. Dengan demikian, tidak seperti dalam solusi pertama, Anda benar-benar harus menetapkan$obj
variabel normal yang dapat menyimpan referensi objek untuk membuat perubahan negara.sumber
JavaScript
Ok, jadi saya membuat versi yang lebih pendek yang berfungsi sebagai SSCCE, tetapi tidak lagi mencoba mem-parse JavaScript dengan benar, sehingga penghitungan referensi mungkin tidak berfungsi ketika dimasukkan ke dalam skrip yang lebih kompleks.
sumber
Python
Ini sedikit curang, tapi bagaimana dengan:
sumber
C ++ 11
meskipun ini dapat diperluas untuk bahasa lain yang mendukung penghancur implisit / eksplisit
sumber
new
tanpa satu pundelete
dalam program. Meskipun, untuk tugas ini cukup baik menurut saya :)cout
garis ke atas sebelum}
dan katakan apakah itu berhasil. :-)Scala
Konversi tersirat memungkinkan Anda menyelesaikan ini sambil menetapkan ke variabel lokal normal:
Anda dapat melakukannya dengan tipe yang disimpulkan:
Anda juga dapat menggunakan metode penyetel khusus, meskipun itu membutuhkan nilai L menjadi bidang:
sumber
D
Keluaran:
sumber
Rubi
Seperti yang dijanjikan, inilah jawaban yang menginspirasi pertanyaan.
Class.new
menciptakan kelas anonim. Memanggilto_s
pada kelas anonim memberikan representasi string default dari objek, yang terlihat seperti#<Class:0x007fe3b38ed958>
. Namun, begitu kelas telah ditetapkan ke konstanta,to_s
menjadi konstanta itu. Di Ruby, konstanta adalah variabel yang dimulai dengan huruf besar, jadiobj
referensi ke kelas yang memungkinkannya tetap anonim.Kode saya membungkus
to_s
dalam suatustate
metode, sehingga hasilnya menjadiTidak seperti kebanyakan solusi di sini, ini hanya berfungsi sekali: menetapkan
obj
ke konstanta lain tidak akan mengubah representasi string-nya, dan tidak satu pun akan menetapkan nilai baru untukLValue
.sumber
Di jawa
Saya pikir ini tidak mungkin di Jawa. Tapi…
Kelas utama:
Kucing Kelas:
Saya terinspirasi oleh @tbodt.
sumber
Cat.x = 2
kemudian mencetakCat.x
.Cat otherCat = tom
negara tidak akan berubah sama sekali. Saya sulit percaya bahwa ini memenuhi surat atau semangat peraturan.C ++
Perilaku ini sebenarnya ditentukan dalam standar (dan itulah sebabnya itu sudah ditinggalkan).
Keluaran
Proses yang menyebabkan ini sama dengan jawaban Abhijit tetapi tanpa memerlukan a
std::move
dan sama dengan jawaban marinus tetapi menggunakan kelas standar alih-alih mendefinisikannya sendiri.Sunting: Saya menambahkan beberapa penjelasan. Dalam output, "beberapa alamat" sebenarnya akan menjadi nilai hex untuk alamat integer yang dialokasikan.
std::auto_ptr
melepaskan pointer store ketika ditugaskan ke yang lainauto_ptr
dan menetapkan pointer internal ke 0. Memanggilget()
mengambil akses ke pointer toko.sumber
get()
? Mengapa mengembalikan 0 di akhir?auto_ptr
sudah usang.Python
sumber
Python 2.x
Saya tidak dapat menemukan cara yang tepat untuk melakukan ini tanpa mendefinisikan kelas tambahan.
sumber
Jawa
Semua solusi lain menggunakan bentuk bahasa operator yang berlebihan. Java tidak memiliki kelebihan operator, jadi saya pikir saya macet. Tapi saya datang dengan sesuatu.
Inilah kelas utamanya:
Ada beberapa baris yang mencurigakan, tetapi mereka tidak akan melakukan apa pun jika
Thing
kelasnya benar-benar normal. Bukan:Ini tidak dijamin berfungsi karena utasnya, tapi saya mengujinya di JDK 1.8u5, dan itu berfungsi di sana.
sumber
Gangguan umum
Saya mendefinisikan status sebagai jumlah variabel khusus yang terikat pada vektor. Jadi, penugasan ke variabel khusus mengubah status.
Keluaran:
Ini hanya bekerja dengan penugasan ke variabel khusus, bukan ke variabel leksikal, atau ke slot dalam suatu objek.
Waspadalah itu
do-all-symbols
terlihat di semua paket, sehingga melewatkan variabel yang tidak memiliki paket. Mungkin menghitung simbol ganda yang ada di lebih dari satu paket (ketika satu paket mengimpor simbol dari paket lain).Rubi
Ruby hampir sama, tetapi saya mendefinisikan status sebagai jumlah konstanta yang merujuk pada array.
Keluaran:
Ini adalah generalisasi dari jawaban histokrat untuk objek-objek Ruby yang bukan kelas atau modul. Peringatan muncul karena konstanta Config secara otomatis memuat beberapa kode yang membuat peringatan.
sumber
C ++
Hasilnya mungkin berbeda di platform yang berbeda. Diuji pada ideone .
Keluaran:
sumber
C #
Keluaran:
sumber
=
?B
ke anA
, karenaimplicit operator A(B b)
memiliki efek samping.