Как делают меня окна вызова, DLL функционирует от Ruby?

Это определенно требует полиморфизма и, при желании, если вы хотите сделать его немного более элегантным, фабричный шаблон . Заводской шаблон не волшебство, он просто скрывает if в красивой оболочке.

Почему бы не другой подход, такой как, например, std::variant который в основном является union замаскированным? Что ж, неплохо, если вы можете хранить разные вещи или даже любой вид (std::any) под тем же именем, но это не очень полезно, так как вы также хочу сделать что-то значимое с объектом. Если вы хотите делать совершенно разные, не связанные между собой вещи, то у вас также могут быть разные объекты, ограниченные блоками if (и с совершенно другим кодом). Если, однако, вы хотите делать одинаковые или похожие вещи на разных объектах, то они (обычно) должны быть одинакового или связанного типа.

Различные типы, как правило, не имеют одинаковых элементов данных или одинаковых общедоступных функций-членов. Таким образом, выполнение одного и того же действия на уровне исходного кода с разными типами обычно не работает (кроме как по совпадению).

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

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

17
задан Mike Woodhouse 22 June 2009 в 08:15
поделиться

2 ответа

Взгляните на Win32API stdlib. Это довольно простой (но непонятный) интерфейс для Windows 32 API или DLL.

Документация находится здесь , некоторые примеры здесь . Чтобы дать вам почувствовать вкус:

require "Win32API"    
def get_computer_name
  name = " " * 128
  size = "128"
  Win32API.new('kernel32', 'GetComputerName', ['P', 'P'], 'I').call(name, size)  
  name.unpack("A*")  
end 
15
ответ дан 30 November 2019 в 12:20
поделиться

Я думаю, вы также можете использовать ruby ​​/ dl http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/95a483230caf3d39

или ffi упрощает и упрощает взаимодействие с виртуальными машинами:

https://github.com / ffi / ffi / wiki / Windows-Примеры

6
ответ дан 30 November 2019 в 12:20
поделиться
Другие вопросы по тегам:

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