迭代数组 - 仅修改整数Ruby

时间:2014-08-29 19:57:22

标签: ruby arrays loops

我正在尝试迭代包含数字和字符串的数组。现在我使用以下代码来完成此任务:

def mod_method(source_array, integer_increase)
source_array.map! do |x|
    if x.is_a? Fixnum
        x+=integer_increase
    else
        x
     end 
end
p source
end

因此,这将迭代所有整数并将第二个参数(整数)添加到所有值。我不明白的是,我是这样做的:

def mod_method(source_array, integer_increase)
source_array.map! do |x|
    if x.is_a? Fixnum
        x+=integer_increase
     end 
end
p source
end

它会将非整数的所有内容返回为NIL。我所做的就是摆脱其他的x'。它不会跳过不属于Fixnum类型的元素吗?为什么将这些值设置为零?我想如果我能弄清楚这一点,我将能够重构代码使其看起来更好。谢谢。

2 个答案:

答案 0 :(得分:0)

因为当它不是数字时你返回nil。

你可以做的是在迭代后调用compact方法,它将消除零值。

像这样:

def mod_method(source_array, integer_increase)
  source_array.map! do |x|
    if x.is_a? Fixnum
      x+=integer_increase
    end
  end.compact!
  p source
end

答案 1 :(得分:0)

以下是我的表现:

def mod_method(ary, offset)
  ary.map{ |x| 
    (Fixnum === x) ? x += offset : x
  }
end

mod_method([1, 'a'], 1) # => [2, "a"]

这不会修改传入的数组,它会返回一个新数组。如果你想破坏传入的数组,你已经知道使用map!

Fixnum === x是一种简单的方式来询问Fixnum,如果x是它的类型:

Fixnum === 1 # => true
Fixnum === 'a' # => false

其余部分是三元语句,是if / then / else的单行版本。