Jump to content

РубинКакао

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.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: f6c3420699c280f41d6e603c81fcbb05__1718993280
URL1:https://arc.ask3.ru/arc/aa/f6/05/f6c3420699c280f41d6e603c81fcbb05.html
Заголовок, (Title) документа по адресу, URL1:
RubyCocoa - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)