"Волшебный конструктор" в Ruby для всех атрибутов
Есть ли способ установить метод инициализации по умолчанию, не записывая его?
class DataClass
attr_accessor :title, :description, :childs
def hasChilds?
@childs.nil?
end
end
Хочу инициализировать этот класс стандартными начальными атрибутами. Что-то вроде этого:
$> a = DataClass.new(:title => "adsf", :description => "test")
$> a.title # --> "asdf"
Есть ли такое решение?
5 ответов
В зависимости от того, чего вы пытаетесь достичь, вы можете использовать OpenStruct.
a = OpenStruct.new(:title => "adsf", :description => "test")
>> a.title
=>> "adsf"
Одним из вариантов будет использование Struct
как основа вашего класса. Например:
class DataClass < Struct.new(:title, :description, :childs)
def has_childs?
@childs.nil?
end
end
a = DataClass.new('adsf', 'description')
puts a.title
Теперь важен порядок параметров.
Я считаю, что конструктор гем делает именно то, что вы хотите: http://atomicobject.github.com/constructor/
require 'constructor'
class Horse
constructor :name, :breed, :weight
end
Horse.new :name => 'Ed', :breed => 'Mustang', :weight => 342
Вы можете использовать этот драгоценный камень, а затем просто сделать:
require 'zucker/ivars'
def initialize(variable1, variable2)
instance_variables_from binding # assigns @variable1 and @variable2
end
Драгоценный камень zucker также позволяет использовать хеш! Посмотрите на пример.
Хэши отлично подходит для этого.
horse = Hashie::Mash.new(name: 'Ed', breed: 'Mustang', weight: 342)
horse.name # 'Ed'
horse[:name] # 'Ed'
horse['name'] # 'Ed'
Вы также можете использовать класс Dash для создания реального класса с ограниченными именами атрибутов. И куча других полезных структур данных тоже.