2014-08-29 68 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