ruby是完全面向对象语言,所有的变量所储存的,其实是对象的引用。

所以ruby方法的参数,也都是引用类型。即使是基本的类型,比如布尔,整数,小数等,也是一样。

class MyObject
attr_accessor :param1, :param2 def show
puts "param1 -> #{param1}", "param2 -> #{param2}"
end
end def modify_my_object!(obj)
obj.param1 = 10
obj.param2 = 20
end new_obj = MyObject.new.tap {|x|
x.param1 = 1
x.param2 = 2
}
new_obj.show
# ->
# param1 -> 1
# param2 -> 2 modify_my_object!(new_obj)
new_obj.show
# ->
# param1 -> 10
# param2 -> 20

对于基本类型,传参的效果看起来向值类型,其实不是,只不过基本类型的对象是指向同一个,并且对象是无法修改的。

puts 1.object_id
puts 1.object_id
# ->
#
# puts 1.111.object_id
puts 1.111.object_id
# ->
# -32029600549858966
# -32029600549858966 puts "string".object_id
puts "string".object_id
# -> 结果指向的 object_id 不一样
# 49335600
# puts true.object_id
puts true.object_id
# ->
#
# puts nil.object_id
puts nil.object_id
# ->
#
#

每次的 String 都指向不同的 object_id,而 Fixnum、TrucClass、NilClass 则是指向相同的 object_id,他们是不可变的!

在方法内修改传进来的 Array,当然也包括上例的 MyObject,都是要小心的,为了避免对外部造成影响,可以这么做

def remove_first_element(arr)
arr = arr.dup
arr.delete_at(0)
arr
end array = [1, 2, 3, 4, 5]
array2 = remove_first_element(array)
p array, array2
# ->
# [1, 2, 3, 4, 5]
# [2, 3, 4, 5]

好了,关于引用的传参,就讲到这里吧~

ruby传参之引用类型的更多相关文章

  1. C#篇(三)——函数传参之引用类型和值类型

    首先应该认清楚在C#中只有两种类型: 1.引用类型(任何称为"类"的类型) 2.值类型(结构或枚举) 先来认识一下引用类型和值类型的区别: 函数传参之引用类型: 1.先来一个简单的 ...

  2. 枚举|标志枚举+|(或)和&(与)运算|类型转换|值类型和引用类型|传参|异常|垃圾回收

    枚举部分 enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型. 通常情况下,最好是在命名空间内直接定义枚举,以便该命名空间中的所有类都能够同样方便地访问它. 但是,还可以 ...

  3. c# 值类型与引用类型的传参(形参与实参)

    形参是指被调用方法中的参数 实参是指传递给方法的参数 (1)值类型传参是按值传递 值类型传参,形参接受到的是实参的一个副本,即形参发生变化,实参不会发生任何变化 (2)引用类型参数按值传递 当参数传递 ...

  4. ruby中的多线程和函数的关键字传参

    1.实现ruby中的多线程 # def test1 # n = 1 # if n > 10 # puts "test1结束" # else # while true # sl ...

  5. python传参

    写在前面 Python唯一支持的参数传递方式是『共享传参』(call by sharing) 多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Java的引用类型是这样,基本 ...

  6. .NET 内存基础(通过内存体验类型、传参、及装箱拆箱)

    该随笔受启发于<CLR Via C#(第三版)>第四章4.4运行时的相互联系 一.内存分配的几个区域 1.线程栈 局部变量的值类型 和 局部变量中引用类型的指针(或称引用)会被分配到该区域 ...

  7. 学习笔记:JavaScript传参方式———ECMAScript中所有函数的参数都是按值传递

    我们把命名参数(arguments)视为局部变量,在向参数传递基本类型值时,如同基本类型变量的复制一样,传递一个副本,参数在函数内部的改变不会影响外部的基本类型值.如: function add10( ...

  8. 浅谈对java中传参问题的理解

    之前用的c/c++比较多,在c/c++中对于传参类型,无外乎就是传值.传引用.传指针这几种.但在java中,由于没有指针类型,其传参的方式也发生了相应的变化.在网上找了找,按我之前的理解,java中传 ...

  9. Go 到底有没有引用传参(对比 C++ )

    Go 到底有没有引用传参(对比 C++ ) C++ 中三种参数传递方式 值传递: 最常见的一种传参方式,函数的形参是实参的拷贝,函数中改变形参不会影响到函数外部的形参.一般是函数内部修改参数而又不希望 ...

随机推荐

  1. 网络安全-主动信息收集篇第二章-二层网络扫描之nmap

    nmap是网络层.传输层最重要的扫描工具之一,可以结合脚本对应用层的扫描和对网络弱点发现. 网络层发现nmap使用: Usage: nmap [Scan Type(s)] [Options] {tar ...

  2. [考试反思]1025csp-s模拟测试87:生存

    想起一句话 课上求生存,课下求发展 发展还好说,如何生存? 生存很困难... 没什么可抱怨的.有AK的.高分的也很多. 该说的在<Dust>里说完了,安静会吧. 这场rank43怎么追? ...

  3. CSPS模拟 67

    炸分炸的厉害.(当然这跟b哥定律无关 话说好久没人嘲笑我菜了,快飘的不知道到哪了. 谁能讽我两句我不要面子的. 另外在博客上写些没用的东西好浪费精力啊我又不想当网红 主要是考试的时候心态不稳. 以为T ...

  4. NOIP模拟21+22

    模拟21确实毒瘤...考场上硬刚T3 2.5h,成功爆零 T1.数论 看这题目就让人不想做,考场上我比较明智的打完暴力就弃掉了,没有打很久的表然后找规律. 正解貌似是乱搞,我们考虑一个比较显然的结论: ...

  5. 面试精选:JVM垃圾回收

    Tips:关注公众号:松花皮蛋的黑板报,领取程序员月薪25K+秘籍,进军BAT必备! Java堆中存放着大量的Java对象实例,在垃圾收集器回收内存前,第一件事情就是确定哪些对象是“活着的”,哪些是可 ...

  6. Java加密、解密Word文档

    对一些重要文档,我们为保证其文档内容不被泄露,常需要对文件进行加密,查看文件时,需要正确输入密码才能打开文件.下面介绍了一种比较简单的方法给Word文件添加密码保护以及如何给已加密的Word文件取消密 ...

  7. Zookeeper作为配置中心使用说明

    为了保证数据高可用,那么我们采用Zookeeper作为配置中心来保存数据.SpringCloud对Zookeeper的集成官方也有说明:spring_cloud_zookeeper 这里通过实践的方式 ...

  8. js的ajax请求

    1 js原生get请求 <script> window.onload = function(){ var oBtn = document.getElementById('btn'); oB ...

  9. ES6学习笔记01 -- 暂时性死区 ( temporal dead zone )

    参考文档: let 和 const 命令 - ECMAScript6入门  暂时性死区(temporal dead zone) 理解ES6中的TDZ(暂时性死区) ES6 中 let 暂时性死区详解 ...

  10. netty服务端的创建

    服务端的创建 示例代码 netty源码中有一个netty-example项目,不妨以经典的EchoServer作为楔子. // 步骤1 EventLoopGroup bossGroup = new N ...