Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

Однако имеется метод

to_hash
, который вернет настоящий хэш, отражающим текущее состояние:

envhash = ENV.to_hash

val2var = envhash.invert

Получив такой хэш, мы можем преобразовать его к любому другому виду (например, в массив):

envarr = ENV.to_hash.to_a

Обратное присваивание объекту

ENV
недопустимо, но при необходимости можно пойти обходным путем:

envhash = env.to_hash

#
Выполняем произвольные операции... и записываем обратно в ENV.

envhash.each {|k,v| ENV[k] = v }

14.4.3. Импорт переменных окружения как глобальных переменных

Существует библиотечка

importenv.rb
, которая импортирует все переменные окружения, сопоставляя им глобальные переменные программы:

require "importenv"

# Теперь переменные окружения стали глобальными переменными...

# Например, $PWD и $LOGNAME

where = $PWD

who = $LOGNAME

puts "В каталоге #{where}, вошел как #{who}"

Поскольку библиотека

importenv
пользуется библиотекой
trace_var
, отражение на самом деле двустороннее: если присвоить глобальной переменной новое значение, реальная переменная окружения получит то же значение.

require "importenv"

puts "Мой путь #$PATH"

# Печатается: /usr/local/bin:/usr/bin:/usr/ucb:/etc:.

$PATH = "/ruby-1.8.0:" + $PATH

puts "Моя переменная $PATH теперь равна #{ENV['PATH']}"

# Печатается: /ruby-1.8.0:/usr/local/bin:/usr/bin:/usr/ucb:/etc:.

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

14.5. Сценарии на платформе Microsoft Windows

Как и на лыжном курорте, где девушки ищут мужей, а мужья — девушек, ситуация не так симметрична, как может показаться на первый взгляд.

Алан Линдсей Маккей

Уже отмечалось, что Ruby больше любит ОС UNIX. В каком-то смысле это правда: язык разрабатывался в среде UNIX, в ней лучше всего и работает. Сейчас он, впрочем, перенесен на другие платформы, в том числе на Macintosh; ведется даже работа по переносу на Palm OS. Но если UNIX — основная платформа, то следующая по значимости — Windows.

Пользователи Windows не брошены на произвол судьбы. Существует немало инструментов и библиотек для этой платформы, а разрабатывается

еще больше, многие аспекты Ruby, даже механизм потоков, изначально не зависят от платформы. Наибольшие трудности возникают при управлении процессами, выполнении ввода/вывода и других операций низкого уровня.

В прошлом существовало несколько вариантов Ruby для Windows. Интерпретатор мог быть собран компилятором gcc или Visual С, его работа могла зависеть от наличия библиотеки Cygwin DLL и т.д. Но в последние годы появился «моментальный» инсталлятор для Windows (см. раздел 14.6).

Среда изменяется слишком быстро, чтобы можно было ее сейчас документировать, однако в этом разделе мы все же рассмотрим некоторые вопросы написания сценариев и автоматизации на платформе Windows. Описанные приемы и утилиты должны работать в любой ОС. Если возникнут проблемы, сообщество придет на помощь.

14.5.1. Расширение Win32API

Расширение

Win32API
— исключительно мощный инструмент, если вы собираетесь программировать на относительно низком уровне. Оно позволяет вызывать из Ruby функции Windows API, находящиеся в любой DLL.

Указанная функция становится объектом, а методу new передаются параметры, точно описывающие функцию. Первый параметр — строка, идентифицирующая DLL, в которой находится функция (например,

crtdll
). Второй параметр — имя самой функции, третий — массив строк, описывающих типы параметров функции (массив импорта), а четвертый — строка, описывающая тип возвращаемого значения (строка экспорта).

Массив импорта может содержать следующие значения (регистр не играет роли):

I целое

L число

N число

P указатель на строку

Строка экспорта также может содержать любое из этих значений, а также значение «V», означающее «void».

После того как объект создан, можно обратиться к его методу

call
для вызова функции Windows. Синоним —
Call
.

В примере ниже мы вызываем функцию

GetCursorPos
, которая возвращает указатель на структуру
POINT
. Эта структура состоит из двух полей типа
long
. Чтобы получить их значения, мы можем воспользоваться методом
unpack
:

require 'Win32API'

result = "0"*8 # Восемь байтов (достаточно для двух long).

getCursorXY = Win32API.new("user32","GetCursorPos",["P"],"V")

getCursorXY.call(result)

x, y = result.unpack("LL") # Два long.

В данном случае функция вернула составные двоичные данные, а иногда такие данные нужно подать на вход функции. Понятно, что для этого нужно воспользоваться методом

pack
, который упакует данные в строку.

Поделиться:
Популярные книги

Вечный. Книга I

Рокотов Алексей
1. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.60
рейтинг книги
Вечный. Книга I

Эммануэль

Арсан Эммануэль
1. Эммануэль
Любовные романы:
эро литература
7.38
рейтинг книги
Эммануэль

Последний вздох. Гепталогия

Тарарев Юрий
Последний вздох
Фантастика:
героическая фантастика
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Последний вздох. Гепталогия

Ельцын в Аду

Пульвер Юрий Евгеньевич
Юмор:
юмористическая проза
5.00
рейтинг книги
Ельцын в Аду

Забытые Боги

Likitani
3. Серые будни
Фантастика:
эпическая фантастика
фэнтези
5.00
рейтинг книги
Забытые Боги

Вельяминовы - Дорога на восток. Книга 2

Шульман Нелли
2. Дорога на восток
Приключения:
исторические приключения
5.00
рейтинг книги
Вельяминовы - Дорога на восток. Книга 2

Легенды российских тамплиеров

Никитин Андрей Леонидович
Религия и эзотерика:
эзотерика
5.00
рейтинг книги
Легенды российских тамплиеров

Освобождение

Лейк Кери
Любовные романы:
современные любовные романы
эро литература
4.75
рейтинг книги
Освобождение

Неукротимый Бастард. Дилогия

Измайлов Сергей
Неукротимый бастард
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Неукротимый Бастард. Дилогия

Кодекс Охотника. Книга XXL

Винокуров Юрий
41. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXL

Владимир Набоков: американские годы

Бойд Брайан
2. Биография В. Набокова
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Владимир Набоков: американские годы

Весь Нил Стивенсон в одном томе. Компиляция

Стивенсон Нил Таун
Фантастика:
научная фантастика
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Весь Нил Стивенсон в одном томе. Компиляция

Темное, кривое зеркало. Том 5 : Средь звезд, подобно гигантам.

Уильямс Гарэт Д.
5. Темное, кривое зеркало
Фантастика:
эпическая фантастика
альтернативная история
6.25
рейтинг книги
Темное, кривое зеркало. Том 5 : Средь звезд, подобно гигантам.

Эволюционер из трущоб. Том 16

Панарин Антон
16. Эволюционер из трущоб
Фантастика:
аниме
попаданцы
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 16