Подтвердить что ты не робот

Литералы объектов Ruby (ala javascript)

В рубине вы можете пойти

a = { }
a['a'] = 82
a['b'] = 'foo'
puts a['a'] # 82

Я бы хотел использовать точечную нотацию, например javascript.

puts a.a # 82

Есть ли способ создания объектных литералов и доступа к ним с точечной нотацией в ruby?

4b9b3361

Ответ 1

Вы можете создать Struct.

A = Struct.new(:a, :b)
a = A.new(82, 'foo')
puts a.a
#=> 82

изменить

вы даже можете сделать

a = { }
a['a'] = 82
a['b'] = 'foo'
Struct.new(*a.keys).new(*a.values)

Ответ 2

Структура, в которой вы нуждаетесь, OpenStruct, которые работают так же, как литералы объектов JS. Он перезаписал метод method_missing, который позволяет добавлять новые переменные, используя методы setter.

Ответ 3

Ruby не имеет объектных литералов.

Ruby - это объектно-ориентированный язык на основе классов. Каждый объект является экземпляром класса, и классы несут ответственность за создание экземпляров самих себя. Вы не создаете объекты, просто записывая их, вы должны попросить класс создать экземпляр самого себя, отправив ему сообщение (обычно называемое new, хотя это только соглашение).