Spec-Zone.ru › Ruby 2.3

класс 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.

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

Публичные методы класса

json_create(object) Показать исходный код
# File ext/json/lib/json/add/ostruct.rb, line 11
def self.json_create(object)
  new(object['t'] || object[:t])
end

Десериализует строку JSON, создавая новый объект структуры со значениями v сериализованными с помощью to_json.

Публичные методы экземпляров

as_json(*) Показать исходный код
# 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 и представит этот объект.

to_json(*args) Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API