在Ruby';s字符串类

在Ruby';s字符串类,ruby,string,variable-assignment,operator-keyword,overriding,Ruby,String,Variable Assignment,Operator Keyword,Overriding,我想实现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

我想实现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"

有人能解释一下为什么直接使用update方法会得到与使用[]=(它立即调用update)不同的结果吗?

错误很简单。见:

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

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

但我在FString类中覆盖了该定义?我在别名后添加了一个undef[]=,但没有任何区别:-/您是否删除了
def[]=(i,v)。。。结束
?如果不是,您只是在重新定义该方法。我试过了,
undef[]=
成功了。这是一个令人惊讶的问题。这是一种奇怪的行为。我还没有答案,已经玩了一段时间了,但我想指出的是,您的代码似乎很好。以下内容非常有用:range=range.new(2,3);c=(a.send:[]=,范围为'XX');看起来很像。一个答案是setter方法总是返回正确的操作数。我猜
[]=
与普通的setter属于同一类。
c = (a[2..3] = 'XX')