如果我有以下内容:
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/