класс OpenStruct
OpenStruct — это структура данных, похожая на хэш, которая позволяет определять произвольные атрибуты со значениями. Это достигается с помощью метапрограммирования Ruby для определения методов в самом классе.
Примеры
require "ostruct" person = OpenStruct.new person.name = "John Smith" person.age = 70 person.name # => "John Smith" person.age # => 70 person.address # => nil
OpenStruct использует хэш внутри для хранения атрибутов и значений и может быть даже инициализирован с помощью него:
australia = OpenStruct.new(:country => "Australia", :capital => "Canberra") # => #<OpenStruct country="Australia", capital="Canberra">
Ключи хэша с пробелами или символами, которые обычно не могут использоваться для вызовов методов (например, ()[]*), не будут сразу доступны в объекте OpenStruct как метод для извлечения или присваивания, но их всё равно можно получить через метод Object#send.
measurements = OpenStruct.new("length (in inches)" => 24)
measurements.send("length (in inches)") # => 24
message = OpenStruct.new(:queued? => true)
message.queued? # => true
message.send("queued?=", false)
message.queued? # => false
Для удаления атрибута необходимо выполнить метод delete_field, так как установка значения свойства в nil не удалит атрибут.
first_pet = OpenStruct.new(:name => "Rowdy", :owner => "John Smith") second_pet = OpenStruct.new(:name => "Rowdy") first_pet.owner = nil first_pet # => #<OpenStruct name="Rowdy", owner=nil> first_pet == second_pet # => false first_pet.delete_field(:owner) first_pet # => #<OpenStruct name="Rowdy"> first_pet == second_pet # => true
Реализация
OpenStruct использует структуру поиска методов Ruby для поиска и определения необходимых методов для свойств. Это достигается с помощью методов method_missing и define_singleton_method.
Это следует учитывать, если есть опасения по поводу производительности создаваемых объектов, поскольку при настройке этих свойств гораздо больше накладных расходов по сравнению с использованием хэша или структуры.
Публичные методы класса
Публичные методы экземпляров
# File ext/json/lib/json/add/ostruct.rb, line 17
def as_json(*)
klass = self.class.name
klass.to_s.empty? and raise JSON::JSONError, "Only named structs are supported!"
{
JSON.create_id => klass,
't' => table,
}
end Возвращает хэш, который будет преобразован в объект JSON и представит этот объект.
# File ext/json/lib/json/add/ostruct.rb, line 28 def to_json(*args) as_json.to_json(*args) end
Хранит имя класса (OpenStruct) со значениями этой структуры v в виде строки JSON.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.