【问题标题】:How does one pass an array as a param in a method?如何在方法中将数组作为参数传递?
【发布时间】:2014-08-29 20:11:10
【问题描述】:

我想为这个方法传递一个数组作为参数,尽可能多的值。例如,如果我在add([1,2,3] 中输入[1,2,3],我应该会收到数组的总和值。

def add(a, b)
    a + b
end

def subtract(a, b)
a - b
end

由于我是 Ruby 新手,我不知道该怎么做。谁能解释一下。

【问题讨论】:

    标签: ruby arrays methods param


    【解决方案1】:

    这样做的通常方法是传递可变数量的参数,我从你的问题中假设是Numeric

    def add_em_up(*args)
      args.reduce(:+)
    end
    
    add_em_up(1,2,3,4)    #=> 10
    add_em_up(1,2,3.5,4)  #=> 10.5
    

    【讨论】:

    • +1 表示 #reduce 和 +1 表示 Greedy 运算符。真是太贪心了..呵呵.. :-)
    • 我觉得这有点有趣。发帖 18 小时后,我收到了 10 个赞,因为我的回答有点不足,比如说“令人费解”,但我过去做出的许多杰出贡献还没有获得一个 +1。我想这就是 SO 的生活。
    • 我同意,生活就是这样:-)
    【解决方案2】:

    我认为 Andrew 的帖子很好,但您更有可能看到这样的 is_a 方法:

    def add(val)
      if val.is_a?(Array)
        do something
      else
        @result += val
      end
    end
    

    【讨论】:

      【解决方案3】:

      看看你的earlier question,我猜你希望能够区分数组参数和数字参数。尝试使用kind_of? 方法并根据结果进行分支。有关其他建议,请参阅 this 问题(使用 responds_to? 方法更惯用)。

      def add(val)
        if (val.kind_of?(Array))
          # add each element
        else
          @result += val
        end
      end
      

      要进行添加,您需要使用each 方法对数组的每个元素执行操作。

      val.each do |x|
        @result += x
      end
      

      【讨论】:

      • 何必用kind_of?,直接去if val.respond_to? :each
      • @iain 不。我会使用#instance_of?.. 有很多人可以回复#each.. 或者,您可以使用respond_to?(:to_ary)... #kind_of for kindness#instance_of? 表示 strictness.. :-) 你想成为什么样的人取决于你.. Loll.
      • 是的,我想从字面上回答这个问题,以防 visBar 以后想区分其他集合。您不会希望对数组和哈希执行相同类型的each
      • @ArupRakshit 很多可以响应each,因此记录默认用法(对于类似数组的集合)并让该方法也占用一个块,调用者应该知道它传递了什么。在我负责的代码库中使用instance_of 进行类似的操作,您将无法通过代码审查;)
      猜你喜欢
      • 2012-07-05
      • 1970-01-01
      • 2020-03-16
      • 2011-10-14
      • 2017-01-10
      • 2014-03-25
      • 2015-08-19
      • 2010-10-16
      相关资源
      最近更新 更多