Перебирать макет Ruby FFI Struct - PullRequest
2 голосов
/ 19 марта 2010

Я использую действительно классную библиотеку ruby ​​ffi для доступа к функциям библиотеки c в ruby.

Есть ли способ перебора макета Ruby FFI :: Struct?

пример FFI :: Struct:

class Example < FFI::Struct
  layout :name, string,
         :desc, :string,
         :type, :int,
         :value, :string
end

похоже, это не работает, но что-то вроде псевдокода ниже:

example_struct.each_key do |key|
  puts key
end

Ответы [ 2 ]

3 голосов
/ 19 марта 2010

Глядя на источник struct.rb , я обнаружил, что вы можете вызвать Struct::members, чтобы получить массив символов, которые вы определили как "ключи".

Оттуда вы также получите Struct::values для значений каждого элемента, Struct::offsets для смещений каждого элемента и несколько других методов.

0 голосов
/ 25 октября 2016

Конечно, немного дороже, чем перебирать членов структуры, но вы также можете преобразовать его в хеш с помощью to_h.

Foo = Struct.new(:a, :b, :c)
=> Foo
baz = Foo.new(1,2,3)
=> #<struct Foo a=1, b=2, c=3>
baz.to_h
=> {:a=>1, :b=>2, :c=>3}
...