ruby传参之引用类型
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传参之引用类型的更多相关文章
- C#篇(三)——函数传参之引用类型和值类型
首先应该认清楚在C#中只有两种类型: 1.引用类型(任何称为"类"的类型) 2.值类型(结构或枚举) 先来认识一下引用类型和值类型的区别: 函数传参之引用类型: 1.先来一个简单的 ...
- 枚举|标志枚举+|(或)和&(与)运算|类型转换|值类型和引用类型|传参|异常|垃圾回收
枚举部分 enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型. 通常情况下,最好是在命名空间内直接定义枚举,以便该命名空间中的所有类都能够同样方便地访问它. 但是,还可以 ...
- c# 值类型与引用类型的传参(形参与实参)
形参是指被调用方法中的参数 实参是指传递给方法的参数 (1)值类型传参是按值传递 值类型传参,形参接受到的是实参的一个副本,即形参发生变化,实参不会发生任何变化 (2)引用类型参数按值传递 当参数传递 ...
- ruby中的多线程和函数的关键字传参
1.实现ruby中的多线程 # def test1 # n = 1 # if n > 10 # puts "test1结束" # else # while true # sl ...
- python传参
写在前面 Python唯一支持的参数传递方式是『共享传参』(call by sharing) 多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Java的引用类型是这样,基本 ...
- .NET 内存基础(通过内存体验类型、传参、及装箱拆箱)
该随笔受启发于<CLR Via C#(第三版)>第四章4.4运行时的相互联系 一.内存分配的几个区域 1.线程栈 局部变量的值类型 和 局部变量中引用类型的指针(或称引用)会被分配到该区域 ...
- 学习笔记:JavaScript传参方式———ECMAScript中所有函数的参数都是按值传递
我们把命名参数(arguments)视为局部变量,在向参数传递基本类型值时,如同基本类型变量的复制一样,传递一个副本,参数在函数内部的改变不会影响外部的基本类型值.如: function add10( ...
- 浅谈对java中传参问题的理解
之前用的c/c++比较多,在c/c++中对于传参类型,无外乎就是传值.传引用.传指针这几种.但在java中,由于没有指针类型,其传参的方式也发生了相应的变化.在网上找了找,按我之前的理解,java中传 ...
- Go 到底有没有引用传参(对比 C++ )
Go 到底有没有引用传参(对比 C++ ) C++ 中三种参数传递方式 值传递: 最常见的一种传参方式,函数的形参是实参的拷贝,函数中改变形参不会影响到函数外部的形参.一般是函数内部修改参数而又不希望 ...
随机推荐
- [模板]tarjan——最后通牒
这么久了我还是不会板子,你们随便笑话我吧. 再不会打我实在是无能为力了. 这篇博客写的像个智障一样...写它的目的就是自嘲? 才不是,为了方便查阅,因为我真的记不住. 对于割边,要存储该点入边的编号, ...
- 《吊打面试官》系列-Redis终章_凛冬将至、FPX_新王登基
你知道的越多,你不知道的越多 点赞再看,养成习惯 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难.作为一个在互联 ...
- python 爬取豆瓣书籍信息
继爬取 猫眼电影TOP100榜单 之后,再来爬一下豆瓣的书籍信息(主要是书的信息,评分及占比,评论并未爬取).原创,转载请联系我. 需求:爬取豆瓣某类型标签下的所有书籍的详细信息及评分 语言:pyth ...
- Scrapy进阶知识点总结(三)——Items与Item Loaders
一.Items 抓取的主要目标是从非结构化源(通常是网页)中提取结构化数据.Scrapy蜘蛛可以像Python一样返回提取的数据.虽然方便和熟悉,但Python缺乏结构:很容易在字段名称中输入拼写错误 ...
- PHP对象继承
PHP对象继承<?php class foo{ public function printItem($string) { echo 'Foo: ' . $string . PHP_EOL; } ...
- java多线程与线程并发二:线程互斥
本文章内容整理自:张孝祥_Java多线程与并发库高级应用视频教程 当两条线程访问同一个资源时,可能会出现安全隐患.以打印字符串为例,先看下面的代码: // public class Test2 { p ...
- Django 通过 ORM 实现表的CRUD
Django 通过 ORM 实现表的CRUD 单表的创建 修改 setting.py 文件 DATABASES = { 'default': { 'ENGINE': 'django.db.backen ...
- python:模块1——标准库简介
一.文档 windows系统:IDLE中打开帮助文档 Tutorial:简单入门 Library Reference:python内置函数和标准库(看不完的,当做字典来查)(此外还有pypi(拍派社区 ...
- Linux关机、重启、退出
序号 命令 说明 1 shutdown -h now 立即关机 2 shutdown -h +10 "请各位退出" 十分钟后关机,同时广播通告“请各位退出” 3 shutd ...
- Python开发面试集锦
我正在编写一套python面试开发集锦,可以帮忙star一下,谢谢! 地址:GitHub专栏