【问题标题】:How can you make a ruby function accept either an individual item or collection of items and do the same thing?如何让 ruby​​ 函数接受单个项目或项目集合并执行相同的操作?
【发布时间】:2011-06-17 14:22:42
【问题描述】:

我正在尝试编写一个函数,如果它不是一个集合,它将仅将该函数应用于一个项目,或者将该函数应用于每个集合元素。例如:

用下划线替换空格

foo 'a bear' => 'a_bear'
foo ['a bear', 'a bee'] => ['a_bear', 'a_bee']

这可能吗?

【问题讨论】:

    标签: ruby


    【解决方案1】:

    这取决于您如何定义“收藏”。最自然的选择可能是“任何 Enumerable”,甚至是“使用 each 方法的任何东西”。然而,这会导致一个问题,因为字符串也是可枚举的——至少在 ruby​​ 1.8 中是这样。

    如果你只需要它来处理数组,那很简单:

    def foo(x)
      if x.is_a? Array
        x.map {|item| foo(item)}
      else
        # Do something with x
      end
    end
    

    【讨论】:

      【解决方案2】:

      我个人会使用变量 args:

      def foo(*args)
        args.each { |arg| puts arg }
      end
      
      foo("bar")                    # bar
      foo("bar", "foobar")          # bar \n foobar
      foo(*%w(bar foobar))          # bar \n foobar
      a = ["bar", "foobar"]
      foo(*a)                       # bar \n foobar
      foo("baz", *a)                # baz \n bar \n foobar
      a = "bar"
      foo(*a)                       # bar
      

      如果您不知道您的参数是字符串还是数组,则只需在其前面加上 *

      我发现这在处理可能是单个值的数组时提供了最大的灵活性,因为如果我正在初始化数组,我可以将它们作为参数输入,或者如果我知道它将是一个数组,则安全地传入变量或单个论点。不过它会阻塞哈希。

      【讨论】:

        【解决方案3】:

        您可能对 splat 运算符感兴趣

        def foo(x)
          [*x].map {|item| item.gsub(" ", "_")}
        end
        

        不幸的是,这会将foo("a bear") 作为["a_bear"] 返回,而不是在没有数组的情况下返回"a_bear"

        【讨论】:

        • 还有另一种结果相同的方法:[x].flatten.map{
        【解决方案4】:

        不确定我是否误读了这个问题。下面将使它成为一个函数将以相同的方式处理单个元素或元素数组。如果参数还不是数组,只需对参数进行数组化,如有必要,在最后撤消它。

        def foo(x)
          x = [x] unless x.is_a? Array
          # do array stuff to x
          return result.size > 1 ? result : result.first
        end
        

        【讨论】:

        • 不是很准确;如果 x == [] 或 x == [1] 会发生什么?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多