«Волшебный конструктор» в Ruby для всех атрибутов - PullRequest
2 голосов
/ 16 сентября 2010

Есть ли способ установить метод инициализации по умолчанию, не записывая его?

class DataClass
  attr_accessor :title, :description, :childs
  def hasChilds?
    @childs.nil?
  end
end

Я хочу инициализировать этот класс стандартными начальными атрибутами.Примерно так:

$> a = DataClass.new(:title => "adsf", :description => "test")
$> a.title # --> "asdf"

Есть ли такое решение?

Ответы [ 5 ]

4 голосов
/ 16 сентября 2010

Один из вариантов - использовать Struct в качестве основы вашего класса. Например:

class DataClass < Struct.new(:title, :description, :childs)
  def has_childs?
    @childs.nil?
  end
end

a = DataClass.new('adsf', 'description')
puts a.title

Теперь важен порядок параметров.

2 голосов
/ 26 января 2011

Я считаю, что гем конструктора делает именно то, что вы хотите: http://atomicobject.github.com/constructor/

  require 'constructor'

  class Horse
    constructor :name, :breed, :weight
  end
  Horse.new :name => 'Ed', :breed => 'Mustang', :weight => 342
2 голосов
/ 16 сентября 2010

В зависимости от того, чего вы пытаетесь достичь, вы можете использовать OpenStruct

a = OpenStruct.new(:title => "adsf", :description => "test")
>> a.title
=>> "adsf"
2 голосов
/ 16 сентября 2010

Вы можете использовать этот камень , а затем просто сделать:

require 'zucker/ivars'

def initialize(variable1, variable2)
  instance_variables_from binding # assigns @variable1 and @variable2
end

Драгоценный камень "zucker" также позволяет использовать хэш! Взгляните на пример .

0 голосов
/ 24 апреля 2014

Hashie отлично подходит для этого.

horse = Hashie::Mash.new(name: 'Ed', breed: 'Mustang', weight: 342)
horse.name    # 'Ed'
horse[:name]  # 'Ed'
horse['name'] # 'Ed'

Вы также можете использовать его класс Dash для создания реального класса с ограниченными именами атрибутов.И куча других полезных структур данных тоже.

...