2017-04-07 54 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

好的指出,谢谢! –