重写 Ruby String 类中的子字符串更新运算符

发布于 2024-10-19 12:48:59 字数 691 浏览 6 评论 0原文

我想实现 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

云裳 2024-10-26 12:48:59

错误很简单。请参阅:

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

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

The error is simple. See:

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文