Уже существует метод в ActiveSupport, который делает это.
['an array', 'of active record', 'objects'].index_by(&:id)
И только для справки, вот реализация:
def index_by
inject({}) do |accum, elem|
accum[yield(elem)] = elem
accum
end
end
, Который, возможно, был пересмотрен в (если Вы отчаянно нуждаетесь в остротах):
def index_by
inject({}) {|hash, elem| hash.merge!(yield(elem) => elem) }
end
Взгляните на Что эквивалентно posix popen в win32 api . Я давно отказался от попытки использовать _popen ()
под Windows. Решение на чистом WIN32 работает намного надежнее.
Если mingw передает ваши параметры в sh -c
вместо cmd.exe / c
, то вы, вероятно, захотите изменить эти обратные косые черты. на косую черту. Что-то вроде следующего должно помочь:
"\"C:/Program Files/CA/BrightStor ARCserve Backup/ca_qmgr.exe\" -list"
Согласно странице руководства для popen:
Аргумент команды является указателем на строка с завершающим нулем, содержащая командная строка оболочки. Эта команда передается в / bin / sh с помощью флага -c; интерпретация, если таковая имеется, выполняется оболочкой.
Итак, вы хотите экранировать строку для sh
для синтаксического анализа.
Вам не нужно экранировать аргумент -list
, и вы можете попытаться экранировать пробелы вместо того, чтобы заключать в кавычки все имя программы. У меня нет системы Windows для тестирования, но я бы посоветовал
#define RUN_COMMAND "C:\\Program Files\\CA\\BrightStor\\ ARCserve\\ Backup\\ca_qmgr.exe -list"
int main() {
outputPointer = popen(RUN_COMMAND, "r");
...
}