Вопрос очень низкого уровня о Ruby и ссылках на библиотеки - PullRequest
0 голосов
/ 25 августа 2009

Я работаю в изолированной среде Ruby и пытаюсь добавить в нее библиотеки со смешанными результатами. Однако, это подняло некоторые интересные вопросы о том, как работает Ruby. Я хочу понять, как Ruby связывает библиотеки и как он решает, что загружать при запуске.

Что происходит, когда я делаю

require 'someLib/someClass'

Раньше мне требовались файлы .rb, но поведение с libs другое. Как работает require, если он выглядит так, будто требует директорию, как в

require 'DL'

Как он узнает, какие файлы загружать и как это имя 'DL' зарегистрировано в интерпретаторе?

P.S .: Единственная открытая часть Ruby, с которой я сейчас работаю, это msvcrt-ruby18.dll

Ответы [ 2 ]

3 голосов
/ 25 августа 2009

Когда вы require 'something' Ruby ищет файл с именем something.rb или something.dll/so/bundle в зависимости от вашей платформы.

В случае, если он находит библиотеку dll/so/bundle, он динамически загружает ее и ищет символ с именем Init_something. Соглашение при создании собственного расширения должно включать такую ​​функцию, которая используется интерпретатором ruby ​​для подключения.

Где (в каких каталогах) анализатор ищет rb-файлы и библиотеки определяется путем загрузки, который вы можете добавить с помощью опций -I интерпретатора. Во время выполнения текущий путь загрузки находится в $: (вы можете добавить к нему дополнительные каталоги также во время выполнения), например:

$ irb
irb(main):001:0> puts $:
/opt/local/lib/ruby/site_ruby/1.8
/opt/local/lib/ruby/site_ruby/1.8/i686-darwin9
/opt/local/lib/ruby/site_ruby
/opt/local/lib/ruby/vendor_ruby/1.8
/opt/local/lib/ruby/vendor_ruby/1.8/i686-darwin9
/opt/local/lib/ruby/vendor_ruby
/opt/local/lib/ruby/1.8
/opt/local/lib/ruby/1.8/i686-darwin9
.

ознакомьтесь с документацией require (http://ruby -doc.org / core-1.8.7 / classes / Kernel.html # M001077 )

Я не уверен, что вы подразумеваете под:

P.S. Единственная открытая часть Ruby I должен работать с сейчас 'MSVCRT-ruby18.dll'

Также вы упомянули кое-что о песочнице. Это может помешать вашей способности требовать модули. Найдите $ SAFE, если для $ SAFE установлено значение> 2, вы вообще не сможете использовать require.

0 голосов
/ 25 августа 2009

Ruby использует встроенный глобальный $: (доллар-двоеточие), который представляет собой массив строк, определяющих набор каталогов, используемых load и require.

Когда вы require 'DL', Ruby будет искать $:, что (по крайней мере на моем компьютере, и я ожидаю, что обычно везде) включает в себя "c:/ruby/lib/ruby/1.8/i386-mswin32", где (Ruby установлен в c:/ruby на ПК) Я нахожу dl.so, скомпилированную библиотеку, которая содержит функциональность DL.

...