Az IronRuby programozási nyelv

Névterek

Névterek

Egy szerelvény (assembly) betöltése, a "load" vagy a "require" paranccsal, a "top-level" névterek és osztályok elérhetőek az IronRuby-ból. Az alábbi kód segítségével készítsük el a "models.dll"-t:

namespace Models { public class Person { private string name; public Person(string name) { this.name = name; } public string Name { get { return name; } } } }
A "Models" névtérhez hozzáférhetünk az IronRuby-val, ahogy azt egy Ruby Modul -al tennénk. A nevével, mint egy Ruby konstant változó:
>>> require 'models' => true >>> Models => Models >>> Models.class => Module
Számos oka lehet annak, hogy az IronRuby nem látja a névteret: Kisbetűs névtér: A Ruby konstansoknál szükséges, hogy a nagybetű után karakterek álljanak, a névtereknél illik ezt betartani, hogy az IronRuby-ban is tudjuk használni. "Üres" (“Empty”) névtér: Ahhoz, hogy az IronRuby lásson egy névteret, annak muszáj nem üresnek lennie, mert a CLR névterek csak akkor léteznek, ha rendelkeznek látható gyerekkel. Továbbá a névtér láthatatlan marad az IronRuby számára, ha az csak private/internal gyerekekkel rendelkezik. Ezért muszáj legalább egy darab publikus osztályt tartalmaznia, ha használni akarjuk. Mivel a névterek használhatók, úgy mint Ruby modul, ezért a névterek tetszőlegesen mixelhetőek bármilyen Ruby osztállyal:
class MyApp include Models end
A CLR névterek szempontjából ez nem annyira érdekes, mivel ezek Ruby modulként csak osztályokat tartalmazhatnak. Mí ezzel szemben egy Ruby modulok tartalmazhat osztályokat, függvényeket vagy bármi mást. abár ez hasznos, mivel ekvivalens a C# "using" kulcsszóval, amikor különbötő névterek által tartalmazott osztályokat akarunk bevezetni az aktuális scope-ba:
>>> include Models => Object >>> Person => Models::Person
De van itt egy érdekesség: "Hogyan oldja fel a Ruby a konstans neveket?", bármilyen konstans, ami már létezik az adott scope-ban, és egy ugyanilyen nevűt talál, akkor azt már nem fogja feloldani.
>>> include System => Object >>> AppDomain => System::AppDomain >>> Math => Math
A fenti példa alapján, azt várnánk, hogy a "Math" osztály a System osztálybeli, de nem így van! Mivel a Ruby-nak van saját Math modulja, ezért nem tölti be a System::Math osztályt. Mi a megoldás? Teljes névvel kell hivatkozni a Math osztályra vagy egy új konstanst kell definiálni, amely ezt tartalmazza:
>>> SMath = System::Math => System::Math