Назначение вложенных членов структуры в Ruby FFI - PullRequest
3 голосов
/ 03 апреля 2012

Рассмотрим следующие две структуры FFI:

class A < FFI::Struct
layout :data, :int
end 

class B < FFI::Struct
layout :nested, A
end

Чтобы создать их экземпляры:

a = A.new
b = B.new

Теперь, когда я пытаюсь присвоить a b.nested следующим образом:

b[:nested] = a

Я получаю следующую ошибку:

ArgumentError: put not supported for FFI::StructByValue

Кажется, FFI не позволяет назначать с использованием синтаксиса [], если вложенная структура «вложена по значению», то естьэто не указатель.Если да, то как мне тогда назначить a на b.nested?

1 Ответ

3 голосов
/ 03 апреля 2012

Когда вы используете FFI для вложения, он может работать следующим образом:

b = B.new
b[:nested][:data] = 42
b[:nested][:data] #=> 42

FFI-объект "b" создал свой собственный объект "a";вам не нужно создавать свой собственный.

Похоже, вы пытаетесь создать свой собственный объект "a" и сохранить его:

a = A.new
b = B.new
b[:nested] = a  #=> fails because "a" is a Ruby object, not a nested value

Решениехранить «a» как указатель:

require 'ffi'

class A < FFI::Struct
  layout :data, :int
end

class B < FFI::Struct
  layout :nested, :pointer  # we use a pointer, not a class
end

a = A.new
b = B.new

# Set some arbitrary data
a[:data] = 42

# Set :nested to the pointer to the "a" object
b[:nested] = a.pointer

# To prove it works, create a new object with the pointer
c = A.new(b[:nested])

# And prove we can get the arbitrary data    
puts c[:data]  #=> 42
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...