yandongdiy3300 2009-09-08 10:54
浏览 239
已采纳

ruby语言函数传入的参数全部都是引用类型吗?

ruby语言函数传入的参数全部都是引用类型吗?
[b]问题补充:[/b]
如果都是引用类型的话,传入函数的参数在函数体内可以被修改,会产生很多副作用吧?需要在函数体内对参数进行拷贝构造,避免副作用吗?
[b]问题补充:[/b]
做了个实验,对each迭代器里传入的局部变量x修改,影响了外部实参,实参的object_id也发生了改变

irb(main):043:0> a=[1,2,3]
=> [1, 2, 3]
irb(main):044:0> b=[3,4,5]
=> [3, 4, 5]
irb(main):045:0> c=[a,b]
=> [[1, 2, 3], [3, 4, 5]]
irb(main):046:0> c.each do |x|
irb(main):047:1* puts x.object_id
irb(main):048:1> x[0]="change"
irb(main):049:1> puts x.object_id
irb(main):050:1> end
114150490
114150490
114145900
114145900
=> [["change", 2, 3], ["change", 4, 5]]
irb(main):051:0> c
=> [["change", 2, 3], ["change", 4, 5]]

  • 写回答

2条回答 默认 最新

  • rednaxelafx 2009-09-08 14:17
    关注

    如果你要避免修改传进来的参数的状态的话,做防御性拷贝是个常见做法。很多时候dup一下就行。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?