2015-02-09 87 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