重写 Ruby String 类中的子字符串更新运算符
我想实现 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
有人可以解释为什么使用 update 方法直接给出与使用 []= (立即调用 update)不同的结果吗?
I'd like to implement a functional version of the String class.
Specifically, if you update a substring I want to clone the String, perform the update
and return the resulting new string so I can chain/telescope the operations.
The functionality is easy to code:
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"
What I'm stuck on is that I'd like to use my update method instead of the default []= operator.
But if you run the above code you get the following output:
"test".update( 2..3, XX )
"test"[2..3] = XX
"test".update( 2..3, XX )
test
teXX
XX
Can someone explain why using the update method directly gives different results from using []= (which immediately calls update) ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
错误很简单。请参阅:
方法 []= 始终返回第二个参数
'XX'
(与任何以=
结尾的方法一样),因为它是一个赋值运算符。您可能需要 undef[]=
以避免此错误。The error is simple. See:
The method []= always returns the second argument,
'XX'
(like any method that finishs with=
) because it is a assignment operator. You will probably need to undef[]=
to avoid this error.