覆盖Ruby的String类中的substring update运算符

时间:2011-02-24 23:47:48

标签: ruby string variable-assignment operator-keyword override

我想实现String类的功能版本。 具体来说,如果您更新我要克隆字符串的子字符串,请执行更新 并返回生成的新字符串,以便我可以链接/望远镜操作。 该功能易于编码:

class FString < String
  alias zap []=
  def update( i, v )
    print "\"#{self}\".update( #{i}, #{v} )\n"
    (c = self.dup).zap( i, v )
    c
  end
  def []=( i, v )
    print "\"#{self}\"[#{i}] = #{v}\n"
    self.update(i,v)
  end
end

a = FString.new "test"
b = a.update( 2..3, 'XX' )
c = (a[2..3] = 'XX')

print "#{a}\n#{b}\n#{c}\n"

我坚持的是,我想使用我的更新方法而不是默认的[] =运算符。 但是如果你运行上面的代码,你会得到以下输出:

"test".update( 2..3, XX )
"test"[2..3] = XX
"test".update( 2..3, XX )
test
teXX
XX

有人可以解释为什么直接使用更新方法会产生与使用[] =(立即调用更新)不同的结果吗?

1 个答案:

答案 0 :(得分:0)

错误很简单。参见:

c = (a[2..3] = 'XX')

方法[] =总是返回第二个参数'XX'(就像用=完成的任何方法一样),因为它是一个赋值运算符。您可能需要取消[]=以避免此错误。