【问题标题】:Ruby's `delete_if` methodRuby 的`delete_if` 方法
【发布时间】:2016-09-11 01:27:17
【问题描述】:

这段代码:

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

返回 ["b","a","c","d"] 而不是 ["b","c","d","b"]。如果x=="a",为什么不删除?谁能告诉我为什么这个方法不能像我希望的那样工作?

【问题讨论】:

  • 这段代码实际上应该导致string 是一个空数组。您正在为数组中的每个项目删除数组的第一个元素。由于前一个元素被删除后,下一个元素成为第一个元素,因此块总是返回 true,从而导致一个空数组。
  • 一旦“a”被删除,“b”变为string[0],迭代器将移动到位置2,将新的string[1]与string[0]进行比较,即“ a" == "b"。下一个匹配 string[0] 的可能字符是最后的“b”。
  • 为了避免这个问题,你应该使用reject,它不会改变原始字符串:new_string = string.reject { |char| char == string[0] }。如果你仍然想使用delete_if,它总是修改原始字符串,你可以写first_char = string[0],然后将{|x| x == first_char}放在delete_if块中。
  • 在您的第一条语句之后,变量string 包含一个array。您应该避免这种令人困惑的命名。同样,不要将变量 array 用于哈希或将 hash 用于字符串。

标签: ruby


【解决方案1】:

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"]
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多