RubyCocoa - RubyCocoa
RubyCocoa een Mac OS X raamwerk dat een brug tussen levert Ruby en Objective-C programmeertalen, zodat de gebruiker Objective-C manipuleren voorwerpen Ruby, en vice versa. Het maakt het mogelijk om een schrijven Cocoa applicatie volledig in Ruby alsmede op een toepassing die Ruby en Objective-C-code mengt schrijven. Een Apple project genaamd MacRuby in ontwikkeling was om RubyCocoa in 2008 vervangen door een eigen spin-off genaamd RubyMotion werd vervolgens uitgebracht in 2012, beschikbaar voor iOS, OS X en Android.
Enkele nuttige toepassingen van RubyCocoa zijn verkenning van een Cocoa object functies met irb interactief, prototyping van een Cocoa applicatie, het schrijven van een Cocoa-applicatie die de kenmerken van Ruby en Objective-C en inheemse omwikkelen van Mac OS X combineert GUI voor een Ruby script.
RubyCocoa is vrije software , vrijgegeven onder zowel de Ruby-licentie en de LGPL .
Inhoud
Geschiedenis
RubyCocoa werd in 2001 gestart door Hisakuni Fujimoto toen hij een Ruby uitbreidingsmodule om NSObject en NSClassFromString functie wikkel geïmplementeerd. Later werd geïntegreerd met Project Builder (later Xcode ). In 2002 werd het project geregistreerd op SourceForge en de ontwikkeling team begon te groeien.
In 2006 werd de lijst committers eerst vergezeld door een ontwikkelaar van Apple , Laurent Sansonetti, en vervolgens werd een RubyCocoa presentatie tijdens de WWDC . Apple verklaarde dat RubyCocoa zullen worden opgenomen en ondersteund in Mac OS X versie 10.5 “Leopard”.
In augustus 2008, Sansonetti bevestigd dat MacRuby " wordt verondersteld te RubyCocoa vervangen. " In de toekomst.
Hoe werkt de brug werken?
RubyCocoa soms geïnterpreteerd als een reeks banden op de Cocoa frameworks, die onjuist. RubyCocoa is een echte brug tussen de Objective-C en Ruby programmeertalen.
Lazy Class Import
RubyCocoa zal de Objective-C klassen importeren in de Ruby wereld on demand. Bijvoorbeeld, wanneer u OSX::NSTableViewvoor de eerste keer in de code, RubyCocoa zal alle nodige informatie met betrekking tot deze klasse van de Objective-C runtime ophalen en maak een Ruby klasse met dezelfde naam, dat zal fungeren als een proxy. Het zal ook importeren op dezelfde manier alle geërfd klassen.
doorsturen van berichten
Zoals eerder gezegd, RubyCocoa creëert speciale proxy objecten. Elke keer als je een Ruby bericht te sturen naar een proxy-object, zal RubyCocoa proberen om het te doen toekomen aan de ingebedde Objective-C bijvoorbeeld door het vertalen van de naam bericht naar een Objective-C selector en het stellen van de Objective-C runtime door te sturen.
Als er een uitzondering wordt opgewekt uit de Objective-C wereld, zal RubyCocoa het te converteren naar een uitzondering Ruby en stuurt het naar jou.
RubyCocoa gebruikt de libffi bibliotheek om de Objective-C-methoden implementaties noemen.
Automatische Methode Dwingende
RubyCocoa maakt het gemakkelijk om een Objective-C-methode overschrijven van Ruby, hetzij in een subklasse of direct naar de klasse (zoals je zou doen in Objective-C met behulp van een categorie).
Zodra uw methode is geplaatst, wordt RubyCocoa de ondertekening van de bestaande Objective-C-methode op te halen en te injecteren een nieuwe om de Objective-C runtime, van dezelfde signatuur, maar die wijst nu naar uw code.
Om dit te bereiken, RubyCocoa gebruikt de libffi bibliotheek om dynamisch creëren van een sluiting die de Ruby methode zal roepen, en gaat gewoon een pointer naar die nieuwe sluiting van de Objective-C runtime.
Toegang tot de C Bits
Vanwege de aard van de taal Objective-C, kunt u vrij gebruik maken van C van Objective-C-code. Om de relevante delen van een C Objective-C kader, zoals C structuren, functies, opsommingen, constanten en overbruggen RubyCocoa gebaseerd op de BridgeSupport project.
RubyCocoa zal interpreteren tijdens runtime de BridgeSupport bestanden (met behulp van de zeer snelle libXML 2's XmlTextReader) en dus de inhoud ervan te behandelen. Het zal bijvoorbeeld de bouw Ruby proxy klassen voor C structuren en ook de functies te maken.
Merk op dat de kostbare operaties, zoals het lokaliseren van de symbolen, worden gedaan op de vraag, en uiteraard slechts een keer.
Format Strings
RubyCocoa is in staat om API's die format strings gebruiken op te sporen, zoals NSLog of NSString.stringWithFormat, en op passende wijze de variabele argumenten om te zetten in het type gespecificeerd in de format string.
functie Pointers
RubyCocoa kunt u doorgeven Ruby Procobjecten als functie pointer argumenten. Vervolgens gebruikt de libffi bibliotheek om dynamisch een sluiting en doorgeven aan de onderliggende functie / methode.
Hoe maak je een Cocoa applicatie geschreven in Ruby start
Wanneer u RubyCocoa installeren, de bijbehorende Xcode worden templates automatisch geïnstalleerd. Dus als u een nieuw project starten, selecteert Cocoa-Ruby Application project van het type en alle benodigde bestanden worden gegenereerd.
Hoe wordt Objective-C-methoden van Ruby noemen
Om een Objective-C methode aan te roepen, u elke dubbele punt in de naam van de methode te vervangen, behalve de laatste met een underscore. Zo kan bijvoorbeeld de NSWindow instantie methode initWithContentRect:styleMask:backing:defer:wordt initWithContentRect_styleMask_backing_defer.
Alle Cocoa klassen en functies behoren tot OSXmodule, zodat bijvoorbeeld de Objective-C-code:
[[NSWindow alloc] initWithContentRect:frame
styleMask:NSTitledWindowMask
backing:NSBackingStoreBuffered
defer:NO]
zal worden:
OSX::NSWindow.alloc.initWithContentRect_styleMask_backing_defer(frame,
OSX::NSTitledWindowMask,
OSX::NSBackingStoreBuffered,
false)
Zoals u kunt zien, dit vermindert de leesbaarheid van de code door het verlenen van Objective-C parameter naamgeving nutteloos. Dus, is er nog een handige manier om de methode oproepen te schrijven - de objc_sendmethode, die Ruby symbolen als parameter namen accepteert. Zo kan bijvoorbeeld de vorige code ook worden geschreven als:
OSX::NSWindow.alloc.objc_send(:initWithContentRect, frame,
:styleMask, OSX::NSTitledWindowMask,
:backing, OSX::NSBackingStoreBuffered,
:defer, false)
Voordelen van de RubyCocoa
- Als Ruby is een geïnterpreteerde taal, is er geen noodzaak om de toepassing te vaak opnieuw te compileren tijdens de ontwikkeling.
- Enkele van rijke mogelijkheden Ruby's, zoals ingebouwde reguliere expressies ondersteuning, het schrijven van de code sneller, en ook RubyCocoa een ideaal hulpmiddel voor prototyping.
nadelen
- Het negeren van de snelheid van de Ruby interpreter wordt RubyCocoa toepassingen steeds trager dan Objective-C / Cocoa toepassingen door de toegevoegde overhead van object conversie.
- Omdat Ruby niet thread-safe, is het niet mogelijk om natief verzenden meerdere threads RubyCocoa code uit te voeren. geëmuleerde threads Ruby's, echter, kan worden gebruikt.