2017-04-07 78 views
1

有人可以解釋什麼使得這個方法在第一對之後退出循環?閉括號紅寶石方法

def closed_parens(string) 

    chars = string.split(//) 

    chars.each_with_index do |c, i| 

    if c == "(" 

     chars.shift 
     if chars[0] != ")" 
     return false 
     else 
     chars.shift 
     end 

    elsif c == "{" 

     chars.shift 
     if chars[0] != "}" 
     return false 
     elsif 
     chars.shift 
     end 

    elsif c == "[" 

     chars.shift 
     if chars[0] != "]" 
     return false 
     else 
     chars.shift 
     end 

    end 

    end 

    if chars.length > 0 
    return false 
    else 
    return true 
    end 
end 

closed_parens("{}{}") 
+1

它的時間,以滿足['case'(https://ruby-doc.org/core-2.4。 0/doc/syntax/control_expressions_rdoc.html#label-case + Expression)語句。這也可以通過查找匹配對的表來改善:例如,'{'['=>']','('=>')','<' =>'>',...}。 – tadman

+1

是的,我知道這是最理想的,我想用我能想到的所有方式來寫這種方法:)謝謝! –

回答

0

這是事實上,你在通過它迭代數組時調用shift

例如:

[1] pry(main)> a = [1,2,3,4] 
=> [1, 2, 3, 4] 
[2] pry(main)> a.each { puts a.shift } 
1 
2 
=> [3, 4] 
[3] pry(main)> 

each不運行4次,它只能運行,因爲移位的2倍。

+0

啊,我看到了,謝謝你是有道理的。我會嘗試另一種方式 –

1

在迭代它時,您不想在Enumerable對象上使用shift

你可能想看看進入Enumerable#each_cons方法,你可以不喜歡

[your enumerable item].each_cons(2) do |current_item, next_item| 
    # do some work... 
end 
+0

好的指出,謝謝! –