在Ruby中使用gsub函数时,为什么红宝石的行为就像通过引用传递?

时间:2018-07-25 19:04:42

标签: ruby

给出以下两种方法:

    [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!是否通过引用使其成功?

谢谢!

1 个答案:

答案 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"

顺便说一句:对我来说,这种影响是我自己代码中导致缺陷的第一大原因。