ruby - 为什么 String.tap 不返回修改后的字符串?

标签 ruby

我在做

String.new.tap do |string|
  polygon.points.each do |point|
    x, y = point.x + (page_padding/2), point.y + (page_padding/2)
    string += "#{x}, #{y} "
  end
end

但它返回一个空字符串。

如果我打电话

Array.new.tap do |array|
  polygon.points.each do |point|
    x, y = point.x + (page_padding/2), point.y + (page_padding/2)
    array << "#{x}, #{y} "
  end
end

它返回一个修改后的数组。为什么这不适用于字符串?

使用 ruby 2.4.0

最佳答案

+=不是突变子:str1 += str2创建一个新字符串。使用 <<改变字符串:

string1 = 'foo'
string1.object_id
=> 70298699576220
(string1 += '2').object_id # changed
=> 70298695972240
(string1 << '2').object_id # not changed: original object has been mutated
=> 70298695972240

tap只是将自己交给 block ,然后返回自己。自 self在您的实例中不会发生变化,点击只会返回原始值。

关于ruby - 为什么 String.tap 不返回修改后的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42586200/

相关文章:

带 block 的 Ruby 方法链接 - 令人困惑的不一致语法错误

ruby - 连续从子进程中读取 STDOUT 和 STDERR

ruby-on-rails - Rails link_to 在按钮元素中不起作用

javascript - 如何将数组从js传递到 Controller

ruby-on-rails - RSPEC 未定义局部变量或方法 `response'

python - 我可以找到相似的条目并将它们组合在一起吗?

ruby-on-rails - 如何在 Rails 中创建事件记录类的非持久化实例?

ruby - Redmine - Ruby - 寻找自定义字段的值

ruby - 关于 Ruby 中 OBJECTS 的问题

ruby-on-rails - 如何在 ruby​​ on rails 中通过 websocket 发送一个 keep-alive 数据包