2014-08-29 69 views
0

我想遍历包含数字和字符串的数组。现在我用下面的代码来实现:对数组进行迭代 - 只修改整数Ruby

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

'map!'用指定块的返回值替换数组中的每个值。丢弃'else',为非整数元素返回'nil' – 2014-08-29 20:03:19

+0

您需要提供样本输入数据,并显示所需输出的示例。 – 2014-08-29 20:10:15

+0

使用'else'完全可以接受。 'map'需要看到块的每次迭代都返回的东西,否则它使用'nil',又叫'我什么也没有'。 – 2014-08-29 20:14:08

回答

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 
+0

你没有返回任何东西,你返回'无'。 – 2014-08-29 23:56:18

+0

右思,错误的话。感谢您指出。 – lcguida 2014-09-01 19:24:45

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的单行版本。

+0

谢谢,我真的很喜欢这个!我试图找到一种方法,使它看起来不那么笨重,这似乎是它。 – HectorOfTroy407 2014-08-29 20:25:27

+0

这基本上就是你的基于'if'的逻辑所做的事情,然而,'?:'三元有时候可以帮助你更清楚地理解。如果误用了代码,可能会导致代码的可读性降低,因此通常建议仅将代码用于单行情况,如本例。 – 2014-08-31 00:17:10