代码之家  ›  专栏  ›  技术社区  ›  Jason

在传递对一个方法的引用之后,任何使用该引用的mod在方法之外都不可见-ruby?

  •  1
  • Jason  · 技术社区  · 15 年前

    我通过了 名称 模名 ,我从方法内部修改引用的对象,但在方法外部看不到更改,如果我从所有位置引用同一个对象,那么根据引用的位置,值会有什么不同?

    name = "Jason"
    
    puts name.object_id      #19827274
    
    def mod_name(name)
      puts name.object_id    #19827274
      name = "JasonB"
    end
    
    puts name.object_id      #19827274
    
    puts name                #Jason
    

    字符串可能是一个坏例子,但即使使用fixnum,我也会得到相同的结果。

    4 回复  |  直到 15 年前
        1
  •  3
  •   Jimmy Nitzan Tomer    15 年前

    正如Greg提到的,在您的示例中,您正在创建一个名为 name 这将隐藏参数。这是由于 写上拷贝 . 如果希望函数影响参数引用的对象,可以使用 replace 而不是像这样做一个任务:

    def mod_name(name)
      name.replace('JasonB')
    end
    
        2
  •  1
  •   user336851    15 年前

    改变字符串的内容:

    def mod_name(name)
      print "%i %s\n" % [name.object_id, name]
      name[0..-1] = "what"
      print "%i %s\n" % [name.object_id, name]
      name << "ever"
      print "%i %s\n" % [name.object_id, name]
    end
    

    也:

    • 在示例代码中,您从不调用mod_name函数。

    • 你似乎相信写“var=x”会改变var的内容。它不能。它只能更改var所指向的对象。在矫揉造作之前和之后请求它的对象ID会显示它确实是另一个字符串。

    • 由于fixnum在ruby中是不可变的,所以无法使此函数与fixnum一起工作。不能对fixnum进行任何修改。更糟糕的是,它们甚至没有通过引用传递,在某些情况下,它们的行为也不会像正确的对象那样。

        3
  •  1
  •   Beanish    15 年前

    我想你已经回答了你提出的问题。也许你需要一个答案来回答是什么让你问这个问题。

    name = "jason"
    
    def mod_name(name)
      local_name = "jasonb"
    end
    
    puts name = mod_name(name)
    puts name
    

    根据此方法的生存位置(例如,如果它在类中),您可能会使用一个实例变量 @name 而且根据范围的不同,也不必通过。

    @name = "jason"
    
    def mod_name()
      @name = "jasonb"
    end
    
    puts @name
    
        4
  •  0
  •   Greg Campbell    15 年前

    在这种情况下, name = "JasonB" 行正在创建名为 name 并将“jasonb”分配给它,而不是修改传入的字符串。