代码之家  ›  专栏  ›  技术社区  ›  iand675

如何使ruby函数接受单个项或项集合并执行相同的操作?

  •  0
  • iand675  · 技术社区  · 16 年前

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

    用下划线替换空格

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

    4 回复  |  直到 16 年前
        1
  •  1
  •   sepp2k    16 年前

    这取决于你如何定义“收藏”。最自然的选择可能是“任何可枚举的”或者甚至是“任何有一个each方法的东西”。但是这会导致一个问题,因为字符串也是可枚举的——至少在Ruby1.8中是这样。

    如果您只需要将其用于阵列,那么很容易:

    def foo(x)
      if x.is_a? Array
        x.map {|item| foo(item)}
      else
        # Do something with x
      end
    end
    
        2
  •  1
  •   Rupert Madden-Abbott    15 年前

    我个人会使用变量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
  •  0
  •   Andrew Grimm Alex Wayne    16 年前

    您可能对splat操作符感兴趣

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

    不幸的是,这会回来的 foo("a bear") 作为 ["a_bear"] ,而不是 "a_bear"

        4
  •  -2
  •   tfe    16 年前

    不知道我是否误读了这个问题。下面将使函数以相同的方式处理单个元素或元素数组。如果参数还不是数组,则直接数组化参数,并在必要时在末尾撤消该参数。

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