stringtranslate.com

RubíCacao

RubyCocoa es un framework para macOS que proporciona un puente entre los lenguajes de programación Ruby y Objective-C , permitiendo al usuario manipular objetos Objective-C desde Ruby, y viceversa. Permite escribir una aplicación Cocoa completamente en Ruby, así como escribir una aplicación que combine código Ruby y Objective-C. En 2008, se estaba desarrollando un proyecto de Apple llamado MacRuby para reemplazar a RubyCocoa. Posteriormente, en 2012, se lanzó una versión derivada de propiedad exclusiva llamada RubyMotion , disponible para iOS, macOS y Android.

Algunas aplicaciones útiles de RubyCocoa son la exploración de las características de un objeto Cocoa con irb de forma interactiva, la creación de prototipos de una aplicación Cocoa, la escritura de una aplicación Cocoa que combine las características de Ruby y Objective-C y la envoltura de la GUI nativa de macOS para un script Ruby.

RubyCocoa es un software libre , publicado bajo la licencia Ruby y la LGPL .

Historia

RubyCocoa fue creado en 2001 por Hisakuni Fujimoto cuando implementó un módulo de extensión Ruby para encapsular las funciones NSObject y NSClassFromString. Más tarde se integró con Project Builder (que luego se convirtió en Xcode ). En 2002, el proyecto se registró en SourceForge y el equipo de desarrollo comenzó a crecer.

En 2006, un desarrollador de Apple , Laurent Sansonetti, se unió a la lista de colaboradores y luego se realizó una presentación de RubyCocoa durante la WWDC . Apple declaró que RubyCocoa se incluiría y sería compatible con Mac OS X v10.5 “Leopard”.

En agosto de 2008, Sansonetti confirmó que MacRuby "supone reemplazar a RubyCocoa" en el futuro.

¿Cómo funciona el puente?

RubyCocoa se interpreta a veces como un conjunto de enlaces a los frameworks Cocoa, lo cual es falso. RubyCocoa es un verdadero puente entre los lenguajes de programación Objective-C y Ruby.

Importación de clase perezosa

RubyCocoa importará las clases Objective-C al mundo Ruby cuando lo necesite. Por ejemplo, cuando acceda OSX::NSTableViewpor primera vez a su código, RubyCocoa recuperará toda la información necesaria sobre esta clase desde el entorno de ejecución Objective-C y creará una clase Ruby con el mismo nombre que actuará como proxy. También importará de la misma manera todas las clases heredadas.

Reenvío de mensajes

Como se indicó anteriormente, RubyCocoa crea objetos proxy especiales. Cada vez que envía un mensaje Ruby a un objeto proxy, RubyCocoa intentará reenviarlo a la instancia Objective-C incorporada, traduciendo el nombre del mensaje a un selector Objective-C y solicitando al entorno de ejecución Objective-C que lo reenvíe.

Si se genera una excepción del mundo Objective-C, RubyCocoa la convertirá en una excepción Ruby y se la reenviará.

RubyCocoa utiliza la biblioteca libffi para llamar a las implementaciones de métodos Objective-C.

Anulación automática del método

RubyCocoa facilita la anulación de un método Objective-C desde Ruby, ya sea en una subclase o directamente en la clase (como lo haría en Objective-C usando una categoría).

Una vez insertado su método, RubyCocoa recuperará la firma del método Objective-C existente e inyectará uno nuevo en el entorno de ejecución de Objective-C, con la misma firma, pero que ahora apunta a su código.

Para lograr esto, RubyCocoa utiliza la biblioteca libffi para crear dinámicamente un cierre que llamará al método Ruby y simplemente pasa un puntero a ese nuevo cierre al entorno de ejecución de Objective-C.

Accediendo a los bits C

Debido a la naturaleza del lenguaje Objective-C, puede utilizar libremente C a partir del código Objective-C. Para unir las partes C relevantes de un marco Objective-C, como estructuras, funciones, enumeraciones, constantes y más, RubyCocoa se basa en el proyecto BridgeSupport.

RubyCocoa interpretará en tiempo de ejecución los archivos BridgeSupport (utilizando el rapidísimo xmlTextReader de libXML 2) y gestionará su contenido en consecuencia. Por ejemplo, construirá las clases proxy de Ruby para las estructuras C y también creará las funciones.

Tenga en cuenta que las operaciones costosas, como la localización de los símbolos, se realizan a pedido y, obviamente, solo una vez.

Cadenas de formato

RubyCocoa puede detectar API que utilizan cadenas de formato, como NSLog o NSString.stringWithFormat, y convertir adecuadamente los argumentos de las variables a los tipos especificados en la cadena de formato.

Punteros de función

RubyCocoa le permite pasar Procobjetos Ruby como argumentos de punteros de función. Luego, utilizará la biblioteca libffi para crear dinámicamente un cierre y pasarlo a la función o método subyacente.

Creación de aplicaciones Cocoa escritas en Ruby

La instalación de RubyCocoa también instala automáticamente las plantillas Xcode correspondientes . Esto permite a los desarrolladores seleccionar "Aplicación Cocoa-Ruby" como tipo de proyecto Xcode y Xcode generará todos los archivos necesarios para ellos.

Cómo llamar a métodos Objective-C desde Ruby

Para invocar un método Objective-C, se reemplazan cada uno de los dos puntos del nombre del método, excepto el último, por un guión bajo. De este modo, por ejemplo, el método de instancia NSWindow initWithContentRect:styleMask:backing:defer:se convierte en initWithContentRect_styleMask_backing_defer.

Todas las clases y funciones de Cocoa pertenecen al OSXmódulo, así que, por ejemplo, el código Objective-C:

[[ NSWindow alloc ] initWithContentRect : estilo de marco Máscara : NSTitledWindowMask respaldo : NSBackingStoreBuffered aplazamiento : NO ]     

se convertirá en:

OSX :: NSWindow.alloc.initWithContentRect_styleMask_backing_defer ( marco , OSX :: NSTitledWindowMask , OSX :: NSBackingStoreBuffered , falso )   

Como puede ver, esto reduce la legibilidad del código al hacer que los nombres de los parámetros de Objective-C sean inútiles. Por lo tanto, existe otra forma conveniente de escribir las llamadas a métodos: el objc_sendmétodo, que acepta símbolos de Ruby como nombres de parámetros. Por ejemplo, el código anterior también se puede escribir como:

OSX :: NSWindow.alloc.objc_send ( : initWithContentRect , frame , : styleMask , OSX :: NSTitledWindowMask , : backing , OSX :: NSBackingStoreBuffered , : defer , false )       

Ventajas de RubyCocoa

Desventajas

Referencias

Enlaces externos