ruby - 为什么 concat 和 << 在分配时不更改字符串变量

标签 ruby

如果我有以下内容:

puts "---doesn't change---"

def change_string(val)
  val = "abc"
end

str = "some"
change_string(str)
puts str

puts "---does change---"

def change_string_two(val)
  puts "val is of class: #{val.class}"
  val << " extra"
  puts "val is of class: #{val.class}"
end

change_string_two(str)
puts str
puts "str is of type: #{str.class}"

puts "---does change---"

str = "xxx"

def change_string_three(val)
 val.concat(" more things")
end

change_string_three(str)
puts str

它输出:

---doesn't change---
some
---does change---
val is of class: String
val is of class: String
some extra
str is of type: String
---does change---
xxx more things

我知道它正在传递一个对象引用,但我很困惑,在一种情况下它不会改变,而在两种情况下它会改变。这是 Ruby 中的字符串所特有的吗?

最佳答案

这不是 Ruby 特有的。 val.concat("x")val << "x"修改值 val指的是。只要你有一个函数,其中传递的参数是一个引用,那么调用参数的方法会改变它,这将导致最初引用的东西发生改变。

val = "abc"这样的赋值另一方面重新分配局部变量 val指代新的事物,并保持它之前指代的事物不变。

如果要替换字符串而不是添加字符串,请使用 val.replace("abc") ,例如

def replace(val)
  val.replace("abc")
end

str = "123"
replace(str)
puts str

输出“abc”。

关于ruby - 为什么 concat 和 << 在分配时不更改字符串变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57619916/

相关文章:

ruby - 使用 mongomapper 保存日期/时间

html - 使用 join 时如何在 Rails View 中显示 HTML 元素数组(作为 HTML,而不是字符串)

ruby-on-rails - 简单 Action Controller 出错

ruby-on-rails - 检测这是 iframe 加载还是直接加载

ruby - Parslet:识别给定关键字以外的任何内容

ruby - 带有命名键的百分比格式字符串不接受带有字符串键的散列?

ruby - 破折号星破折号 (-*-) 在 Ruby 文件中的作用是什么?

ruby - 如何查询 Mongoid 正则表达式字段?

ruby-on-rails - ActiveRecord - 在查找多对多关系时避免记录实例化

ruby-on-rails - 有没有办法获取域的站点地图?