Определите, существует ли значение в массиве хешей

Динамические языки как Perl делают это все время. Интерпретатор Perl записан в C, и много модулей Perl частично записаны в C. Когда те модули требуются, скомпилированные компоненты C динамично загружаются на лету. Как отмечено в другом ответе, механизм для хранения тех модулей является DLLs на окнах и совместно использованными библиотеками (.so файлы) на UNIX. Я полагаю, что призыв к загрузке общей библиотеки по UNIX является dlopen (). Можно, вероятно, найти указатели для того, как выполнить это на UNIX путем запуска с документации для того вызова. Для Windows необходимо было бы исследовать DLLs и изучить, как загрузить их динамично во времени выполнения. [Или возможно пройдите слой эмуляции UNIX Cygwin, который, вероятно, позволил бы Вам использовать те же запросы к Windows, как Вы будете на UNIX, но я не рекомендовал бы что, если Вы уже не используете и компилируете против Cygwin.]

Примечание, что это отличается от просто соединения против общей библиотеки. Если Вы будете знать заранее точно, что кодирует Вас, то будет звонить, можно создать против общей библиотеки, и сборка будет "динамично связана" с той библиотекой; без любой специальной обработки от Вас стандартные программы из библиотеки будут загружены в память только, когда и если Ваша программа на самом деле назовет их. Но Вы не можете сделать этого, если Вы планируете записать что-то способное к загрузке какого-либо произвольный объектный код, код, который Вы не можете определить теперь во время изготовления, но вместо этого ожидают, чтобы быть выбранным так или иначе во время выполнения. Для этого необходимо будет использовать dlopen () и его кузены Windows.

Вы могли бы посмотреть на способ, которым Perl или другие динамические языки делают это для наблюдения некоторых реальных примеров. Библиотекой Perl, ответственной за этот вид динамической загрузки, является DynaLoader; это имеет и Perl и компонент C, я верю. Я уверен, что другие динамические языки как Python имеют что-то подобное, на которое Вы могли бы скорее посмотреть; и у Попугая, виртуальной машины для невыпущенного Perl 6, конечно, есть механизм для того, чтобы сделать это также (или будет в будущем).

В этом отношении, Java выполняет это через свой интерфейс JNI (Java Native Interface), таким образом, Вы могли, вероятно, посмотреть на исходный код для OpenJDK, чтобы видеть, как Java выполняет это и на UNIX и на Windows.

44
задан Andrew Grimm 12 December 2011 в 21:56
поделиться

2 ответа

array_of_hashes.any? {|h| h[:a] == 11}
89
ответ дан 26 November 2019 в 21:52
поделиться

Вы действительно запросили логический результат в OQ, но если вы действительно хотите, чтобы сам хеш-элемент сделал:

array_of_hashes.detect {  |h| h[:a] == 11 }

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

t = array_of_hashes.group_by { |x| x[:a] }
t[11]
18
ответ дан 26 November 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: