WebHU - Programozási kérdések és válaszok

A karakterláncok és szimbólumok rubinváltozhatatlansága (mi lenne, ha változókban tárolnánk őket)

A karakterlánc primitív típus; amikor meghívja a karakterláncot, új objektumazonosítója van. A szimbólum egy hivatkozott típus; amikor szimbólumot hoz létre, létrehoz egy mutatót, amely az értékre mutat.

A szimbólumokat változókban tároltam:

var1 = :foo
var1.object_id # => 2598748
:foo.object_id # => 2598748

var2 = :foo
var2.object_id # => 2598748

var2 = "hello"
var2.object_id # => 70131755422100

Hogyan lehetséges, hogy létrehozok egy második változót var2, és annak ugyanaz az objektumazonosítója, mint a var1? Létrehozok egy második elemet. Ez azt jelenti, hogy a változók egyben mutatók is?

Mindkét változó a :foo szimbólumra mutat. A :foo szimbólum csak egyszer kerül tárolásra, igaz?

Két változó jön létre, tehát a memóriában kell lenniük, és nem lehetnek ugyanazon a helyen, mert más a nevük. var1 és var2 tárolni kell, hogy később felhívhassam őket. Nem értem, hogyan hívhatom őket, ha ugyanaz az objektumazonosítójuk. Ha valaki tudna segíteni ennek megértésében, megköszönném.

05.10.2018

  • A object_id a változó által birtokolt objektumra vonatkozik. A változók nem objektumok, így nincs azonosítójuk. 05.10.2018
  • akkor miért tudom elvégezni a var.object_id függvényt? 05.10.2018
  • Vegye figyelembe, hogy nincs primitív típus a Rubyban, és vegye figyelembe, hogy ezzel szemben hogy pl. A Python és Ruby karakterláncok változtathatók (pl. foo = "hello"; puts foo.object_id; foo << ", world!"; puts foo.object_id; puts foo). 05.10.2018
  • var1.object_id elküldi a object_id üzenetet a var1 által hivatkozott objektumnak. Nyilvánvalóbb lehet, ha megnézi a var1.to_s-t – a "var1" helyett "foo"-t ad vissza. Ez azért van, mert Ön az objektumhoz beszél, nem a változóhoz. 05.10.2018

Válaszok:


1

A rubinváltozók objektumokra való hivatkozások, így amikor egy metódust változóra küld, az objektum, amelyre hivatkozik, az a környezet, amelyben kiértékelődik. Valószínűleg világosabb, ha megnézi a legjobban értékelt válasz első képét (az elfogadott válasz alatt) itt.

Tehát, hogy megtudjuk, mi történik, ássunk bele egy kicsit a dokumentációba, és nézzük meg, mi történik a kódrészlettel.

A Ruby's Symbol osztály dokumentációja: https://ruby-doc.org/core-2.5.0/Symbol.html

A szimbólum objektumok neveket és néhány karakterláncot képviselnek a Ruby interpreterben. Ezeket a :name és :string literals szintaxissal, valamint a különböző to_sym metódusokkal állítják elő. Ugyanaz a Symbol objektum jön létre egy adott névhez vagy karakterlánchoz a program végrehajtásának idejére, függetlenül a név kontextusától vagy jelentésétől. Így ha a Fred egy konstans egy kontextusban, egy metódus egy másikban és egy osztály a harmadikban a Symbol :Fred ugyanaz az objektum lesz mindhárom kontextusban.

Ruby Object#object_id dokumentációja: https://ruby-doc.org/core-2.5.1/Object.html#method-i-object_id

Egész szám azonosítót ad vissza az objektumhoz.

Ugyanazt a számot adjuk vissza egy adott objektum objektum_id paraméterének minden hívásánál, és nincs két aktív objektum, amely osztozna egy azonosítón.

Lépésről lépésre a következőképpen történik:

# We create two variables that refer to the same object, :foo
var1 = :foo
var2 = :foo

var1.object_id = 2598748
var2.object_id = 2598748
# Evaluated as:
# var1.object_id => :foo.object_id => 2598748
# var2.object_id => :foo.object_id => 2598748

Ahogy a fenti első hivatkozásban tárgyaltuk, a Ruby áthaladó érték, de minden érték Object, tehát mindkét változó ugyanazt az értéket adja ki. Mivel minden azonos karakterláncból készült szimbólum (ebben az esetben "foo") ugyanarra az objektumra vonatkozik, és a Object#object_id mindig ugyanazt az azonosítót adja vissza ugyanahhoz az objektumhoz, ugyanazt az azonosítót kapja vissza.

05.10.2018
  • Az igazat megvallva, nem értek egyet az ott található legfelső válasszal – az érték szerinti átadás és a hivatkozás alapján történő átadás egyaránt a C++ (és régebbi) viselkedésekre utal, ahol az érték általi átadás klónozza az értéket, és a hivatkozáson keresztül történő átadás lehetővé teszi magának a változónak a módosítását. Míg technikailag az áthaladó érték-ahol-érték-hivatkozás helyes, ügyetlen azt mondani – és az érték melletti átadás félrevezető (ezt csinálja a PHP, ami nem az, amit Ruby és Python csinálja). Így célszerűbb az érték szerinti hivatkozás, áthaladási megosztás, áthaladó objektum-hivatkozás újabb kifejezéseket használni, amelyek kifejezetten megkülönböztetik azt. 05.10.2018
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..