рубин уменьшить дублирование - PullRequest
0 голосов
/ 16 февраля 2011
class Car
    attr_accessor :door, :window, :engine, :wheel, :mirror, :seat...
end

my_car = Car.new
my_car.door, my_car.window, my_car.engine, my_car.wheel = "door", "window", "engine", "wheel"

Я не хочу многократно набирать my_car.Я знаю, что могу определить initialize(door, window, engine, wheel), но есть ли другой способ сделать это?Что-то вроде

my_car.METHOD do
    door, window, engine, wheel = "door", "window", "engine", "wheel"
end

Ответы [ 5 ]

2 голосов
/ 16 февраля 2011

Вы можете сделать это в конструкторе:

class Car
  attr_accessor :door, :window, :engine, :wheel, :mirror

  def initialize(opts={})
     opts.each {|k,v| self.send("#{k}=", v)}
  end
end

Затем вы можете указать все параметры во время создания объекта:

my_car = Car.new(:door => "4dr", :engine => "2.4L")

p my_car
#<Car:0x8a585f4 @door="4dr", @engine="2.4L">
1 голос
/ 16 февраля 2011

Для части вопроса «есть ли другой способ»:

Эта форма

my_car.METHOD do
  door, window, engine, wheel = "door", "window", "engine", "wheel"
end

похожа на instance_eval который оценивает блок в контексте объекта:

my_car.instance_eval do
  @door = "door"
  @window = "window"
end

PS Не спорю, лучший ли это способ, хотя:)

0 голосов
/ 16 февраля 2011

Вы можете определить инициализацию доходности:

def initialize(&block)
  instance_eval(&block)
end

Тогда

my_car = Car.new do
  @door = "door"
  @window = "window"
  #...
end

Тот факт, что вы должны использовать @attr, заключается в том, что такой оператор, как "var = value", будет предполагать, что вы задали новый локальный вариант.

0 голосов
/ 16 февраля 2011

Может быть, вам могут помочь аспекты: Module.assign

Тогда это будет:

my_car.assign( :door => "door", :window => "window" .... )
0 голосов
/ 16 февраля 2011
%w(door window) |f|
    my_car.send(f + "=", "some string, possibly f itself like the next line")
    my_car.send(f + "=", f)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...