Ruby:如果是数组,则将函数映射到某个函数上,如果是单个对象,则执行一次

时间:2013-08-28 17:05:06

标签: ruby-on-rails ruby

我目前正在为Ruby中的一个函数执行此操作:

if @to_pass.kind_of?(Array)
        @to_pass.map do {|item| do_a_function(item)}
    else
        do_a_function(item)
    end

是否有更短的做法“如果这是一个数组,映射并应用函数,如果没有,那么执行函数”?

4 个答案:

答案 0 :(得分:3)

您只需将单个对象转换为数组即可。如果你没有使用输出,每个都比map更好,因为它不会创建一个新数组。

# if single object doesn't respond to to_a
# as Guilherme Bernal pointed out in comments, flatten(1) should be used rather than flatten
[@to_pass].flatten(1).each {|item| do_a_function(item) }

# if it does
@to_pass.to_a.each {|item| do_a_function(item) }

答案 1 :(得分:3)

只需使用Array方法,它将创建一个包含单个项目的数组,或者只返回原始数组。

Array(@to_pass).map { |item| do_a_function(item) }

答案 2 :(得分:1)

你可以随时转换为数组并使用flatten,如下所示:

([@to_pass].flatten).map { |item| do_a_function(item) }

这是有效的,因为flatten将保持已经扁平化的数组。

答案 3 :(得分:0)

我会用这个:

[*@to_pass].map{ |e|
  ...
}

如果@to_pass是单个元素或数组,则它将转换为数组。