РубинКакао
RubyCocoa — это macOS платформа , которая обеспечивает мост между языками программирования Ruby и Objective-C , позволяя пользователю манипулировать объектами Objective-C из Ruby и наоборот. Это позволяет написать приложение Cocoa полностью на Ruby, а также написать приложение, сочетающее код Ruby и Objective-C. Проект Apple под названием MacRuby находился в стадии разработки, чтобы заменить RubyCocoa в 2008 году. Впоследствии в 2012 году был выпущен собственный дополнительный продукт под названием RubyMotion , доступный для iOS, macOS и Android.
Некоторые полезные приложения RubyCocoa — это интерактивное исследование функций объекта Cocoa с помощью irb , создание прототипа приложения Cocoa, написание приложения Cocoa, сочетающего в себе функции Ruby и Objective-C, а также оболочка собственного графического интерфейса macOS для сценария Ruby.
RubyCocoa — бесплатное программное обеспечение , выпущенное как под лицензией Ruby , так и под лицензией LGPL .
История
[ редактировать ]RubyCocoa был запущен в 2001 году Хисакуни Фудзимото, когда он реализовал модуль расширения Ruby для оболочки функций NSObject и NSClassFromString. Позже он был интегрирован с Project Builder (который позже стал Xcode ). В 2002 году проект был зарегистрирован на SourceForge и команда разработчиков начала расти.
В 2006 году к списку коммиттеров впервые присоединился разработчик из Apple была сделана презентация RubyCocoa Лоран Сансонетти, а затем во время WWDC . Apple заявила, что RubyCocoa будет включена и поддерживаться в Mac OS X v10.5 «Leopard».
В августе 2008 года Сансонетти подтвердил, что MacRuby « должен заменить RubyCocoa » в будущем.
Как работает мост?
[ редактировать ]RubyCocoa иногда интерпретируется как набор привязок к платформам Cocoa, что неверно. RubyCocoa — это настоящий мост между языками программирования Objective-C и Ruby.
Ленивый импорт классов
[ редактировать ]RubyCocoa импортирует классы Objective-C в мир Ruby по требованию. Например, когда вы получаете доступ OSX::NSTableView
Впервые в вашем коде RubyCocoa получит всю необходимую информацию об этом классе из среды выполнения Objective-C и создаст одноименный класс Ruby, который будет действовать как прокси. Таким же образом будут импортированы все унаследованные классы.
Пересылка сообщений
[ редактировать ]Как говорилось ранее, RubyCocoa создает специальные прокси-объекты. Каждый раз, когда вы отправляете сообщение Ruby прокси-объекту, RubyCocoa попытается переслать его во встроенный экземпляр Objective-C, преобразуя имя сообщения в селектор Objective-C и запрашивая среду выполнения Objective-C переслать его.
Если в мире Objective-C возникает исключение, RubyCocoa преобразует его в исключение Ruby и пересылает вам.
RubyCocoa использует библиотеку libffi для вызова реализаций методов Objective-C.
Автоматическое переопределение метода
[ редактировать ]RubyCocoa позволяет легко переопределить метод Objective-C из Ruby либо в подклассе, либо непосредственно в классе (как это было бы в Objective-C с использованием категории).
После вставки вашего метода RubyCocoa получит подпись существующего метода Objective-C и внедрит в среду выполнения Objective-C новую с той же сигнатурой, но которая теперь указывает на ваш код.
Для этого RubyCocoa использует библиотеку libffi для динамического создания замыкания, которое будет вызывать метод Ruby, и просто передает указатель на это новое замыкание в среду выполнения Objective-C.
Доступ к битам C
[ редактировать ]Из-за особенностей языка Objective-C вы можете свободно использовать C из кода Objective-C. Чтобы соединить соответствующие части C структуры Objective-C, такие как структуры C, функции, перечисления, константы и многое другое, RubyCocoa полагается на проект BridgeSupport .
RubyCocoa будет интерпретировать во время выполнения файлы BridgeSupport (используя очень быстрый xmlTextReader из libXML 2) и соответственно обрабатывать их содержимое. Например, он создаст прокси-классы Ruby для структур C, а также создаст функции.
Обратите внимание, что дорогостоящие операции, такие как локализация символов, выполняются по требованию и, очевидно, только один раз.
Форматирование строк
[ редактировать ]RubyCocoa может обнаруживать API, использующие строки формата, такие как NSLog или NSString.stringWithFormat, и соответствующим образом преобразовывать переменные аргументы в типы, указанные в строке формата.
Указатели функций
[ редактировать ]RubyCocoa позволяет вам передать Ruby Proc
объекты в качестве аргументов указателя функции. Затем он будет использовать библиотеку libffi для динамического создания замыкания и передачи его базовой функции/методу.
Создание приложений Cocoa, написанных на Ruby.
[ редактировать ]Установка RubyCocoa также автоматически устанавливает соответствующие шаблоны Xcode . Это позволяет разработчикам выбрать «Приложение Cocoa-Ruby» в качестве типа проекта Xcode, и Xcode сгенерирует для них все необходимые файлы.
Как вызывать методы Objective-C из Ruby
[ редактировать ]Чтобы вызвать метод Objective-C, вы заменяете каждое двоеточие в имени метода, кроме последнего, на подчеркивание. Так, например, метод экземпляра NSWindow initWithContentRect:styleMask:backing:defer:
становится initWithContentRect_styleMask_backing_defer
.
Все классы и функции Cocoa принадлежат OSX
модуль, например, код Objective-C:
[[NSWindow alloc] initWithContentRect:frame
styleMask:NSTitledWindowMask
backing:NSBackingStoreBuffered
defer:NO]
станет:
OSX::NSWindow.alloc.initWithContentRect_styleMask_backing_defer(frame,
OSX::NSTitledWindowMask,
OSX::NSBackingStoreBuffered,
false)
Как видите, это снижает читаемость кода, делая бесполезным именование параметров Objective-C. Итак, есть еще один удобный способ записи вызовов методов — objc_send
метод, который принимает символы Ruby в качестве имен параметров. Например, предыдущий код также можно записать так:
OSX::NSWindow.alloc.objc_send(:initWithContentRect, frame,
:styleMask, OSX::NSTitledWindowMask,
:backing, OSX::NSBackingStoreBuffered,
:defer, false)
Преимущества РубиКакао
[ редактировать ]- Поскольку Ruby является интерпретируемым языком, нет необходимости часто перекомпилировать приложение во время разработки.
- Некоторые богатые возможности Ruby, такие как встроенная поддержка регулярных выражений , ускоряют написание кода, а также делают RubyCocoa идеальным инструментом для прототипирования.
Недостатки
[ редактировать ]- Если игнорировать скорость интерпретатора Ruby, приложения RubyCocoa всегда будут медленнее, чем приложения Objective-C/Cocoa, из-за дополнительных затрат на преобразование объектов.
- Поскольку Ruby не является потокобезопасным, невозможно направить несколько собственных потоков для выполнения кода RubyCocoa. Однако можно использовать эмулированные потоки Ruby.