给出以下两种方法:
[53] pry(main)> def my_method
[53] pry(main)* leti = 'leti'
[53] pry(main)* edit(leti)
[53] pry(main)* leti
[53] pry(main)* end
=> :my_method
[54] pry(main)> def edit(a_leti)
[54] pry(main)* a_leti.gsub!('e', '3')
[54] pry(main)* a_leti
[54] pry(main)* end
=> :edit
[55] pry(main)> my_method
=> "l3ti"
有人可以解释为什么我要在edit
方法中编辑值而不是原始值('leti')。尽管Ruby是按价值传递的。实际上,如果我使用一个简单的赋值而不是使用函数gsub
,则会得到原始值。 gsub!
是否通过引用使其成功?
谢谢!
答案 0 :(得分:0)
在Ruby中:像字符串这样的对象都是通过引用传递的。具有诸如字符串之类的对象的变量实际上是对这些字符串的引用。参数按值传递。但是,对于字符串,这些是对这些字符串的引用。
这是经典示例:
irb(main):004:0* a = "abcd"
=> "abcd"
irb(main):005:0> b = a
=> "abcd"
irb(main):006:0> b << "def"
=> "abcddef"
irb(main):007:0> a
=> "abcddef"
irb(main):008:0> b
=> "abcddef"
如果您不想修改原始字符串,则需要对其进行复制:
(很多)三种方法可以做到:
b = a.dup
b = a.clone
b = String.new a
使用dup
irb(main):009:0> a = "abcd"
=> "abcd"
irb(main):010:0> b = a.dup
=> "abcd"
irb(main):011:0> b << "def"
=> "abcddef"
irb(main):012:0> a
=> "abcd"
irb(main):013:0> b
=> "abcddef"
顺便说一句:对我来说,这种影响是我自己代码中导致缺陷的第一大原因。