Sokszor láttam olyan kijelentéseket, mint például: “Kérem, tegye ezt a funkciót első osztályú állampolgárnak ilyen és olyan nyelven / platformon”. Például a C # /. Neten szereplő összegekről mondják. Tehát mikor tekinthető egy funkció egy “első osztályú állampolgárnak” egy programozási nyelven / platformon?

Megjegyzések

Válasz

Definíció

Az objektum első osztályú, ha:

  • változókban és adatstruktúrákban tárolható
  • paraméterként átadható egy alprogramnak
  • alprogram eredményeként visszaadható
  • futás közben elkészíthető
  • belső identitással rendelkezik (függetlenül az adott névtől)

Az “objektum” kifejezést itt lazán használják, nem feltétlenül utal az objektumokra az objektum-orientált programozásban. A legegyszerűbb skaláris adattípusok, például az egész és a lebegőpontos számok, szinte mindig első osztályúak.

http://en.wikipedia.org/wiki/First_class_object

Megjegyzések

  • Tehát mi teszi az enums másodosztályú objektummá a .net / C # -ban?
  • @Gulshan – vitathatod a belső identitás hiányát – a C # enumok alapvetően csak szintaktikus cukor (azaz egy ” keresztnév “) egész számra. Hasonlítsuk össze a Java-val, ahol az enumok önálló objektumok.
  • @mikera, a .NET-ben az enums önmagukban értékek. A Java egyszerűen nem rendelkezik értékekkel, csak objektumokkal, amelyek ‘ az egyetlen különbség.
  • @mikera: Bár ez megakadályozza a Java ‘ s felveti, hogy vannak olyan szép tulajdonságai, mint például a bitmezők ábrázolása velük. Bár megvalósításuk valószínűleg első osztályú-y, legtöbb API-juk még mindig rengeteg egész (vagy karakterlánc) állandót tartalmaz, és ezek sok felhasználását nem lehet könnyen pótolni enumokkal.
  • I don ‘ nem gondolja, hogy az enumokat futás közben lehet elkészíteni a .Net-ben, nem? Úgy gondoltam, hogy mindig konstansok.

Válasz

A ” első osztályú állampolgár ” vagy ” első osztályú elem ” programozási nyelvet Christopher Strachey brit informatikus vezette be az 1960-as években az első összefüggésben osztályú funkciók. Ennek az elvnek a leghíresebb megfogalmazása valószínűleg Gerald Jay Sussman és Harry Abelson Számítógépes programok felépítése és értelmezése

  • Változók nevezhetik meg őket.
  • Argumentumként továbbadhatják az eljárásoknak.
  • Visszaadhatók a eljárások.
  • Lehet, hogy szerepelnek az adatstruktúrákban.

Alapvetően azt jelenti, hogy ezzel megteheti programozási nyelv eleme, amit a programozási nyelv összes többi elemével megtehetsz.

Mindez a ” egyenlő jogok “: a fentieket megteheti, mondjuk egész számokkal, akkor miért kellene másnak másnak lennie?

A fenti meghatározás kissé korlátozó abban az értelemben, hogy csak igazán az első osztályúság azon aspektusáról beszél, amely a program tárgyainak lenni kapcsolódik Legyen az, hogy egy dolog első osztályú, ha mindent meg tud vele csinálni, más hasonló dolgokkal is.

Például a Java operátorok és a Java módszerek hasonlóak. Meghatározhat új módszereket, (kissé) szabadon választhatja meg saját módszereinek nevét, felülírhatja a módszereket, túlterhelheti a módszereket. James Gosling mindezt megteheti az operátorokkal is, de te és én nem tudunk. Úgy értem, a közhiedelemmel ellentétben a Java támogatja az operátorok túlterhelését: például , a + operátor túlterhelt a byte, short, int, long, float, double és String és a Java 7 IIRC BigInteger és BigDecimal (és valószínűleg egy elfelejtett pár) esetén is, csak te nek nincs befolyása rá.Ez egyértelműen másodrendűvé teszi az üzemeltetőket e második meghatározás szerint. Ne feledje, hogy a módszerek még mindig nem az első definíció szerint első osztályú objektumok. (Ez az operátorokat harmadik osztályúvá teszi?)

Megjegyzések

  • Remek válasz. Például a pipenv dokumentumok szerint ” A Windows első osztályú állampolgár, a világunkban. ” Ez azt jelentené, hogy mindent megtehet az pipenv vel Windows rendszeren, amit Linuxon is megtehet?
  • nem, nem gondolom, hogy ” első osztályú polgár iv id = “d6c985c9ee kifejezés használata ‘ “>

köze van a kifejezés formális programozási nyelvelmélet definíciójához. Úgy gondolom, hogy a pipenv csak a kifejezést használja normál standard angol jelentésével.

  • Ahogyan a ” bánásmódban részesültek? ” Köszönöm a segítséget.
  • Válasz

    Általában ez a refe rs olyan konstrukcióra, amely paraméterként átadható, definiálható egy függvény visszatérési típusaként vagy hozzá lehet rendelni egy értéket. Általában futás közben képesnek kell lennie azok elkészítésére. Például egy osztály egy első osztályú polgára lenne a c ++ vagy a java fájlokban, de a C függvény nem.

    Megjegyzések

    • Mitől lesz egy osztály első osztályú polgár a c ++ – ban?
    • @bjarkef: Úgy hangzik, hogy erre már válaszoltak az előző mondatokban szereplő leírásnak való megfeleléssel.
    • @Jonathan: Igen, sajnálom, rosszul olvastam a ” konstrukciókat futás közben “. Igen, futás közben létrehozhat egy osztály példányát (objektumot), magát az osztályt azonban nem. Ez zavart meg.
    • A paraméter által történő továbbadás még mindig nem elég. A C / C ++ – ban továbbra is másodosztályú polgárnak tekinteném a funkciókat. Paraméterként továbbadhatók, más objektumok belsejében elhelyezett eredményekként visszaadhatók. De más szerkezetek segítsége nélkül nem lehet őket manipulálni (például az std :: bind szükséges a paraméterek függvényhez kötéséhez).
    • @Martin soha nem mondtam, hogy a függvények első osztályú polgárok voltak a C / C ++ kategóriában .

    Válasz

    Azt mondanám, hogy egy funkció első osztályú polgár, ha azt kizárólag a nyelv valósítja meg .
    azaz nem igényel több nyelvi funkciót vagy szabványos könyvtárat a szolgáltatás megvalósításához.

    Példa:

    A C / C ++ verzióban nem tartom elsőnek a függvényeket osztály polgára (mások is).
    Ez azért van, mert vannak olyan módszerek, amelyek manipulálják azokat a funkciókat, amelyeket a nyelv közvetlenül támogat, de más nyelvi jellemzők használatát igénylik. A paraméterek kötése egy függvényhez közvetlenül nem támogatott, és a funkció megvalósításához fel kell építenie egy functort.

    Megjegyzések

    • Wouldn ‘ t, amelyek kötött függvényeket (vagy ” bezárásokat “) tesznek, nem lehetnek első osztályúak, míg maguk a függvények? Hogyan befolyásolja 0x ‘ a bezárások támogatása elemzését?
    • @Fred Nurk: Minden a nyelvtől függ. Egyes nyelvekben a bezárások első osztályú rendszerek. Másokban nem. Még nem ismerem eléggé a C ++ 0x-et ahhoz, hogy kifejezett megjegyzést tegyek.
    • Mondjuk ‘ snek, hogy a nyelv vagy C, vagy C ++ (de nem 0x ), ahogy válaszolsz is. Nem ‘ t határozná meg a ” első osztályú ” függvényeket (vagy ” bezárások “) nem lehetnek első osztályúak, míg maguk a funkciók?
    • @Fred Nurk: Ha korlátozod az egyetlen dolog, amit megtehet egy funkcióval, az, hogy bezárja őket, akkor biztos. De nekem az ‘ tetszik mondani, hogy ha a platform csak az könyvtár importálásával támogatja az egész számok hozzáadását. Ekkor az egész számok első osztályú polgárok, de az egészek hozzáadását nem vesszük figyelembe. Véleményem szerint a bezárás egy olyan művelet, amelyet végre lehet hajtani egy olyan funkcióval, amely hatékonyan ad vissza egy új függvényt (de ez attól függ, hogyan definiálja). De a lezárás és a megkötés csak két művelet, hogy mennyi mást zárunk ki a vitából (nem vagyok biztos benne, hogy ez kérdés volt).
    • @Martin: Nem szabad egyértelműen magyaráznom magam. A (z) ” alapján egy szolgáltatás első osztályú állampolgár, ha kizárólag a ” nyelv valósítja meg, majd a C és a C ++ függvények is megvalósításra kerülnek kizárólag a nyelv által, és így első osztályú lenne. A bekötött függvényeket (amelyeket ” bezárásoknak [div id = “d6c985c9ee”>

    is nevezhetünk) ‘ re kötésparaméterekkel stb. beszélni, de ez ‘ más tulajdonságot mutat.

    Válasz

    Példa hozzáadása a már megadott válaszokhoz:

    A WCF-ben / C # jelenleg egy osztályobjektumot meg kell jelölni egy szolgáltatási szerződés attribútummal, hogy szolgáltatásként működjön. Nincs ilyen:

    public **service** MyService (in relation public **class** MyClass). 

    Az osztály első osztályú állampolgár a c # -ben, ahol a szolgáltatás nem.

    Remélem ez segít

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük