我想实现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
有人可以解释为什么直接使用更新方法会产生与使用[] =(立即调用更新)不同的结果吗?
答案 0 :(得分:0)
错误很简单。参见:
c = (a[2..3] = 'XX')
方法[] =总是返回第二个参数'XX'
(就像用=
完成的任何方法一样),因为它是一个赋值运算符。您可能需要取消[]=
以避免此错误。