【问题标题】:Why is splat argument in ruby not used all the time?为什么 ruby​​ 中的 splat 参数不一直使用?
【发布时间】:2013-05-14 03:10:11
【问题描述】:

我知道当我们不知道要传递的参数数量时使用 splat 参数。我想知道我是否应该一直使用 splat。每当我传递参数时,使用 splat 参数是否有任何风险?

【问题讨论】:

    标签: ruby splat


    【解决方案1】:

    当您正在编写的方法确实需要具有任意数量的参数时,对于 Hash#values_at 这样的方法来说,splat 非常好。

    一般来说,如果一个方法实际上需要固定数量的参数,那么使用命名参数比传递数组并且必须记住哪个位置用于哪个目的要清楚得多。例如:

    def File.rename(old_name, new_name)
      ...
    end
    

    比:

    def File.rename(*names)
      ...
    end
    

    您必须阅读文档才能知道旧名称是第一名还是第二名。在方法内部,File.rename 需要围绕您是否传递了正确数量的参数来实现错误处理。因此,除非您需要 splat,否则“正常”的论点通常会更清晰。

    关键字参数(ruby 2.0 中的新功能)在使用时可以更加清晰,尽管它们在标准库中的使用尚未广泛。

    【讨论】:

    • +1 “……有真正的需要……”是这里的关键词。在我看来,一直人为地使用*,“只是因为”,会造成维护问题,并导致 Ruby 代码的惯用性降低。
    • 现在使用命名参数比以前更有意义,例如通过** 操作数传递哈希并转换为命名参数时。
    【解决方案2】:

    对于采用任意数量参数的方法,选项哈希是事实上的解决方案:

    def foo(options = {})
      # One way to do default values
      defaults = { bar: 'baz' }
      options = defaults.merge(options)
    
      # Another way
      options[:bar] ||= 'baz'
    
      bar = options[bar]
      do_stuff_with(bar)
    end
    

    【讨论】:

      【解决方案3】:

      当您使用数组并只想使用数组的第一个参数并对数组的其余部分执行其他操作时,可以很好地使用 splat。它也比其他方法快得多。这是一个聪明人 Jesse Farmer 对它的使用https://gist.github.com/jfarmer/d0f37717f6e7f6cebf72,这是我尝试解决螺旋阵列问题的其他一些方法的一个例子,以及一些与之相关的基准。 https://gist.github.com/TalkativeTree/6724065

      它的问题是它不容易消化。如果您以前看过并使用过它,那很好,但它可能会减慢其他人对代码在做什么的理解。如果你有一段时间没看的话,甚至是你自己的哈。

      【讨论】:

        【解决方案4】:

        Splat 让参数被解释为一个数组,你需要一个额外的步骤来取出它。如果没有 splat,您无需执行特殊操作即可访问参数:

        def foo x
          @x = x
        end
        

        但如果你使用 splat 将它放入数组中,则需要额外的步骤才能将其从数组中取出:

        def foo *x
          @x = x.first # or x.pop, x.shift, etc.
        end
        

        除非必要,否则没有理由引入额外的步骤。

        【讨论】:

          猜你喜欢
          • 2017-06-11
          • 2018-02-18
          • 2012-10-30
          • 1970-01-01
          • 1970-01-01
          • 2014-07-19
          • 1970-01-01
          • 1970-01-01
          • 2015-01-19
          相关资源
          最近更新 更多