2015-02-09 88 views
1

我試圖縮短我的Ruby代碼。Ruby:實例化塊中的新變量

def count_palindromes_in_an(array) 
    palindromes = 0 
    array.each { |word| palindromes += 1 if word == word.reverse } 
    return palindromes 
end 

因此迴文在每個方法執行的塊內被實例化。某事沿着;

def count_palindromes_in_an(array) 
    array.each { |word| (palindromes != nil ? palindromes += 1 : palindromes = 1) if word == word.reverse } 
    return palindromes 
end 

但是,這會返回一個錯誤undefined method 'palindromes'。任何提示感激地收到。

回答

9

這不會起作用,因爲塊會創建一個新的作用域。塊內定義的變量與外部範圍隔離。

[1].each do 
    palindromes = 1 
    local_variables #=> [:palindromes] 
end 

local_variables #=> [] 

要計算數組元素,使用Array#count

array.count { |word| word == word.reverse } 

你甚至可以添加一個palindrome?方法String

class String 
    def palindrome? 
    self == reverse 
    end 
end 

,縮短您的代碼:

array.count(&:palindrome?) 
+0

大answear,但我不認爲猴子修補是一個好主意。 – hakcho 2015-02-09 09:12:00

+0

好的解釋,Stefan!但我覺得我的回答有助於OP更好地實現他想要的。 – Humza 2015-02-09 09:12:25

+0

@Humza我會說不。 'count'更具慣用性,使代碼更短。然而,是的,最後一個解決猴子補丁的核心類的解決方案看起來不太好,但我們假設OP將會閱讀這些內容並予以警告。 – 2015-02-09 09:14:57