Array.each_with_index未按预期运行

时间:2013-04-28 15:28:02

标签: ruby

我重新定义了Array#replace,如下所示。

require 'test/unit'  
class Array  
  def replace (from, to)  
    each_with_index do |e, i|  
      self[i] = to if e = from  
    end  
  end  
end  

class TestDriver <Test::Unit::TestCase  
  def test_replace  
    book_topic = ['html', 'java', 'css']  
    book_topic.replace('java', 'ruby')  
    result_topic = ['html', 'ruby', 'css']  
    assert_equal book_topic, result_topic  
  end  
end  

当我运行该测试用例时,它断言book_topic['html', 'ruby', 'ruby']。我不知道book_topic的结果。谁能告诉我为什么?

2 个答案:

答案 0 :(得分:8)

您错过了=中的e == from

self[i] = to if e == from

PS:我希望你知道覆盖这样的核心方法的优点/缺点。

答案 1 :(得分:2)

考虑使用mapmap!而不是覆盖Array的替换方法。

>> [1,2,3].map { |a| a == 1 ? 2 : a }
=> [2, 2, 3]