2015-02-23 21 views

回答

1

我不知道任何內置的方式,我想這樣做,但你可以只使用map.with_index做到這一點。

def mul_indexes(arr,val) 
    arr.map.with_index { |v, i| i if v == val }.compact 
end 

現在,您可以使用mul_indexes(idols, 'George Costanza')。另外,如果你打算使用過於頻繁,這將是更好,使其Array#mul_indexes

+0

如果這被普遍使用,使得它'陣列#mul_indexes'將使其更容易使用。 – tadman 2015-02-23 16:26:49

+0

'compact'使這個醜陋。考慮使用'each_with_index.with_object([])'。此外,你應該把它包裝在課堂上,而不需要'self.'。 – 2015-02-23 18:56:42

+0

@CarySwoveland它並不醜陋。當我沒有在塊中返回任何東西時,假設我們只是刪除了'nil'。是的。 'self'並不需要,因爲我之前已經將它作爲Array的一部分,但是隨後將其刪除,而不更改代碼。 – 2015-02-24 02:00:42

1

與一個單身方法另一種解決方案:

def idols.mul_indexes 
    each_with_index.inject([]) {|m,(e,i)| count(e) > 1 ? m + [i] : m} 
end 

idols.mul_indexes # [2, 4, 6] 
+0

這是一個相當字面解釋的問題。 – 2015-02-23 18:26:52

0

另一種方式:

def indexes(arr, match) 
    arr.each_index.select { |i| arr[i] == match } 
end 

indexes(idols,'George Costanza') 
    #=> [2,4,6] 

我強烈建議不要使用這種簡單方法修復monkey-。

0

您可以隨時擴展Array類來實現該功能

class Array 
    def find_indexes(value) 
     indexes = [] 
     self.each_with_index do |item,index| 
      indexes << index if item == value 
     end 
     return indexes 
    end 
end 

然後就去做:idols.find_indexes('George Costanza')