Я встраиваю Ruby в свой проект C и хочу загрузить несколько файлов, которые определяют класс, унаследованный от моего собственного родительского класса. Каждый унаследованный класс должен устанавливать некоторые переменные при инициализации, и я не хочу иметь две разные переменные для Ruby и C.
Есть ли способ определить переменную класса, у которой есть собственный настраиваемый установщик / получатель, или это глупый способ справиться с этим? Может было бы лучше с нестандартным типом данных?
Я использую Ruby-C-API для интеграции Ruby и использую его как язык сценариев. Мой вопрос больше связан с Ruby, чем с C.;)





Я не совсем понимаю, о чем вы спрашиваете. Конечно, переменные класса могут иметь геттеры и сеттеры (и за кулисами вы можете сохранять значение любым удобным вам способом). Этот фрагмент помогает что-нибудь прояснить?
>> class TestClass
>> def self.var
>> @@var ||= nil
>> end
>> def self.var=(value)
>> @@var = value
>> end
>> end
=> nil
>>
?> TestClass::var
=> nil
>> TestClass::var = 5
=> 5
>> TestClass::var
=> 5
Если вы занимаетесь метапрограммированием в целом, вы можете реализовать метод class_attr_accessor, аналогичный методу attr_accessor. Следующее эквивалентно приведенному выше коду.
class Module
def class_attr_accessor(attribute_name)
class_eval <<-CODE
def self.#{attribute_name}
@@#{attribute_name} ||= nil
end
def self.#{attribute_name}=(value)
@@#{attribute_name} = value
end
CODE
end
end
class TestClass
class_attr_accessor :var
end
Спасибо за ответ. На самом деле я знаю, как сделать это только в Ruby - проблема в том, чтобы предоставить сеттер / получатель и сохранить материал в переменной C для каждого экземпляра класса. Мне нужно значение в C, и я не хочу снова и снова копировать его между Ruby и C.
Я не уверен, действительно ли он ответил на операцию, но это хороший пример.
Что вы имеете в виду, говоря о встраивании Ruby в C? Я не знаком с Ruby, но, возможно, смогу помочь вам, если вы проясните свою проблему.