2011-02-16 111 views
0
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 
+0

什么是与定义问题`初始化()`?你为什么试图从外部初始化这个对象? – 2011-02-16 00:28:36

回答

1

对于问题的一部分 '是有任何其他方式' :

This for米

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 

P.S.并不是说不管它是最好的办法,虽然:)

+0

明白了,该作品,thx – user612308 2011-02-16 01:48:59

0
%w(door window) |f| 
    my_car.send(f + "=", "some string, possibly f itself like the next line") 
    my_car.send(f + "=", f) 
end 
0

也许方面可以帮助你: Module.assign

那么这将是:

my_car.assign(:door => "door", :window => "window" ....) 
0

实际上,你可以定义产量初始化:

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

然后

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

,你必须使用@attr的事实,是因为像“var = value”这样的语句会假设你设置了一个新的本地变体。

+0

这个作品,谢谢 – user612308 2011-02-16 01:49:48

2

您可以在构造函数中做到这一点:

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">