Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何避免实例变量初始化的丑陋_Ruby_Instance Variables - Fatal编程技术网

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

Ruby 如何避免实例变量初始化的丑陋,ruby,instance-variables,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

我在我的代码中一直看到这种情况

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
但即使这样也感觉不对,打字也很烦人。是否有更好的方法根据参数定义实例变量

编辑: 这个问题似乎有两种不同的解决方案。见:


您可能想考虑使用::

class Foo2

不需要定义一个额外的<代码>初始化方法……

,您可能需要考虑使用A:

class Foo2

根本不需要定义额外的
initialize
方法…

是的,这是在Ruby中初始化实例变量的首选方法。打字可能很烦人,但这是一种很好理解的模式。在Ruby中,使用元编程将其自动化是可能的,但会使代码更难理解


我还认为,当一个类包含两个或三个以上的参数时,让它看起来丑陋可能是一件好事。如果您的类依赖于六种不同的功能,那么它很适合重构。

是的,这是在Ruby中初始化实例变量的首选方法。打字可能很烦人,但这是一种很好理解的模式。在Ruby中,使用元编程将其自动化是可能的,但会使代码更难理解


我还认为,当一个类包含两个或三个以上的参数时,让它看起来丑陋可能是一件好事。如果您的类依赖于六种不同的功能,那么它是重构的有力候选对象。

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

  • 使用Struct或OpenStruct
  • 使用ruby的并行赋值
  • 使用元编程使宏类似于

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

  • 使用Struct或OpenStruct
  • 使用ruby的并行赋值
  • 使用元编程使宏类似于
  • 为了帮助解决这个问题,gem最近在Ruby-Tapas上得到了认可。不过,另一个需要考虑的问题是,是否有太多的内容被传递到初始值设定项中。可能是这个类做得太多了,需要分成更小的部分。

    这个gem最近在Ruby Tapas上得到了认可,以帮助解决这个问题。不过,另一个需要考虑的问题是,是否有太多的内容被传递到初始值设定项中。这可能是因为这个类做得太多了,需要分成更小的部分

    def initialize args
      @foo, @baz, @bar = *args
    end
    
    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