如何避免实例变量初始化丑陋

时间:2015-02-15 05:29:48

标签: ruby instance-variables

我在代码

中一直看到这种情况
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

但是,即使这样做感觉不对,也很难打字。有没有更好的方法根据参数定义实例变量?

修改: 这个问题似乎有两种截然不同的解决方案。参见:

5 个答案:

答案 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)

我认为有三种方法可以缩短实例变量的初始化时间:

  1. 使用Struct或OpenStruct。
  2. 使用ruby的并行分配。
  3. 使用元编程来制作像this这样的宏。

答案 4 :(得分:0)

fattr gem最近在 Ruby Tapas 上得到认可,以帮助解决此问题。但另一个考虑因素是,是否有太多东西被传递到初始化器中。可能是这个课程做得太多,需要分成更小的部分。