Ruby的`delete_if`方法

时间:2016-05-15 02:22:04

标签: ruby

此代码:

string="abacdb"
string=string.split("")
string.delete_if{|x| x==string[0]}
puts(string)

返回["b","a","c","d"]而不是["b","c","d","b"]。如果x=="a",为什么不删除?谁能告诉我为什么这种方法不能正常工作呢?

1 个答案:

答案 0 :(得分:3)

delete_if通过递增x的索引来迭代,并在针对元素评估块之后立即删除元素。它继续如下。

  • x的索引:0

    string                      # => ["a", "b", "a", "c", "d", "b"]
    string[0]                   # => "a"
    x                           # => "a"
    delete_if{|x| x==string[0]} # => ["b", "a", "c", "d", "b"]
    
  • x的索引:1

    string                      # => ["b", "a", "c", "d", "b"]
    string[0]                   # => "b"
    x                           # => "a"
    delete_if{|x| x==string[0]} # => ["b", "a", "c", "d", "b"]
    
  • x的索引:2

    string                      # => ["b", "a", "c", "d", "b"]
    string[0]                   # => "b"
    x                           # => "c"
    delete_if{|x| x==string[0]} # => ["b", "a", "c", "d", "b"]
    
  • x的索引:3

    string                      # => ["b", "a", "c", "d", "b"]
    string[0]                   # => "b"
    x                           # => "d"
    delete_if{|x| x==string[0]} # => ["b", "a", "c", "d", "b"]
    
  • x的索引:4

    string                      # => ["b", "a", "c", "d", "b"]
    string[0]                   # => "b"
    x                           # => "b"
    delete_if{|x| x==string[0]} # => ["b", "a", "c", "d"]