我在代码
中一直看到这种情况class Foo
def initialize(foo)
@foo = foo
end
#...
end
这不是太糟糕,但情况变得更糟:
class Foo
def initialize(foo,baz,bar,a,b,c,d)
@foo = foo
@baz = baz
@bar = bar
#etc...
您可以通过执行类似
的操作来解决此问题@foo, @baz, @bar = foo, baz, bar
但是,即使这样做感觉不对,也很难打字。有没有更好的方法根据参数定义实例变量?
修改: 这个问题似乎有两种截然不同的解决方案。参见:
答案 0 :(得分:7)
您可能需要考虑使用Struct
:
class Foo < Struct.new(foo,baz,bar,a,b,c,d)
end
foo = Foo.new(1,2,3,4,5,6,7)
foo.bar #=> 2
根本不需要定义额外的initialize
方法......
答案 1 :(得分:3)
def initialize args
@foo, @baz, @bar = *args
end
答案 2 :(得分:3)
是的,这是在Ruby中初始化实例变量的首选方法。输入可能很烦人,但这是一个很好理解的模式。和Ruby一样,使用元编程来自动化它是可能的,但会使你的代码更难以遵循。
我还认为,当一个班级拿出超过两三个论点时,看起来丑陋可能是一件好事。如果你的课程依赖于六种不同的功能,它就是重构的有力候选者。
答案 3 :(得分:0)
我认为有三种方法可以缩短实例变量的初始化时间:
答案 4 :(得分:0)
fattr gem最近在 Ruby Tapas 上得到认可,以帮助解决此问题。但另一个考虑因素是,是否有太多东西被传递到初始化器中。可能是这个课程做得太多,需要分成更小的部分。