首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《Effective-Ruby》读书笔记

优先使用实例变量(@)而非类变量(@@) 类也是对象,所以它们拥有自己的私有实例变量集合 第三章:集合 第 16 条:在改变作为参数的集合之前复制它们 在 Ruby 中多数对象都是通过引用而不是通过实际值传递的...Ruby 语言自带了两个用来复制对象的方法:dupclone。 它们都会基于接收者创建新的对象,但是与 dup 方法不同的是,clone 方法会保留原始对象的两个附加特性。...首先,clone 方法会保留接受者的冻结状态。如果原始对象的状态是冻结的,那么生成的副本也会是冻结的。而 dup 方法就不同了,它永远不会返回冻结的对象。...其次,如果接受这种存在单例方法,使用 clone 也会复制单例类。由于 dup 方法不会这样做,所以当使用 dup 方法时,原始对象和使用 dup 方法创建的副本对于相同消息的响应可能是不同的。...Ruby 的所有核心类都是通过 C语言 实现的,指出这点是因为某些类的实例方法并没有考虑到子类,比如 Array#reverse 方法,它会返回一个新的数组而不是改变接受者。

4K60

Gitlab CI 配置文件 .gitlab-ci.yaml 详解(下)

这样一,我们可以为每个存档提供一个唯一的名称,当需要从GitLab中下载是才不会混乱。artifacts:name可以使用任何的预定义变量(predefined variables)。...如果没有设置,将从项目中使用默认值。 可以设置的值有:clone,fetch,和none。 clone是最慢的选项。它会从头开始克隆整个仓库,包含每一个job,以确保项目工作区是最原始的。...当GIT_STRATEGY设置为clone或fetch时,可以使用GIT_CHECKOUT变量指定是否应该运行git checkout。如果没有指定,它默认为true。...GIT_SUBMODULE_STRATEGY变量用于在构建之前拉取代码时,Git子模块是否或者如何被引入。...在将来的版本中有可能改变或者完全移除。 你可以通过GIT_DEPTH指定抓取或克隆的深度。它可浅层的克隆仓库,这可以显著加速具有大量提交和旧的大型二进制文件的仓库的克隆。

7.1K21
您找到你想要的搜索结果了吗?
是的
没有找到

盘点 Java 创建对象的 x 操作

那么我问你一个问题,你知道 Java 中如何创建对象吗? 这个问题仿佛是给 Java 新手来写的,好像有点瞧不起在座各位的样子,嗯。。。...使用 new 创建对象 使用 new 创建对象是最简单的一种方式了,new 是 Java 中的关键字,new 通过为新对象分配内存并返回对该内存的引用来实例化一个类,这个实例化一个类其实就相当于创建了一个对象...如果直接使用 new Object() 没有创建局部变量的话,请注意一下它的字节码。 看出来细微的差别了吗?...所以这是第一种创建的方式,也就是使用 new 创建。...使用对象克隆创建对象 这是第四种创建方式,使用 Cloneable 类中的 clone() 方法创建,它的前提是你需要实现 Cloneable 接口并实现其定义的 clone 方法。

59320

Python标准库笔记(7) — copy模块

True dup[0] == my_list[0]: True 上面的浅拷贝实例中,dup 是由 my_list 拷贝而来, 但是 MyClass 实例不会拷贝,所以 dup 列表与 my_list...3.自定义拷贝行为 可以通过自定义 __copy__() 和 __deepcopy__() 方法改变默认的拷贝行为。...4.深拷贝中的递归 为了避免拷贝时有递归数据结构的问题, deepcopy()`` 使用一个字典跟踪已经拷贝的对象。这个字典被传递给deepcopy()` 方法进行检查。...下面示例展示了一个相互关联的数据结构(有向图),如何通过实现 __deepcopy__() 方法防止递归。...可以用一个名称和它所连接的现有节点的列表初始化一个实例。 add_connection() 方法用于设置双向连接。它也被深拷贝操作符使用

84580

构造函数没有返回值是怎么赋值的?

实例初始化方法只能在实例的初始化期间,通过 Java 虚拟机的 invokespecial 指令调用, 只有在实例正在构造的时候,实例初始化方法才可以被调用访问。...局部变量表表示方法调用时候的参数传递,当一个实例方法被调用的时候,第0个局部变量存储了当前实例方法所在对象的引用(this),后续的其他参数传递至1到N的连续位置。...以上面测试代码的方法来看Test t = new Test() 的调用过程: new 创建Test对象,并将其引用值压入操作数栈顶 dup 复制栈顶数值并将复制值压入栈顶 invokespecial 使用...dup复制的引用并用来初始化,此时栈顶应该只有new创建的原始引用 astore_1 将new创建的引用存入局部变量表索引为1的位置 return 方法正常返回 ?...从这个过程我们已经看出来了,整个过程最后我们最终拿到了new之后创建的对象引用,并且保存到局部变量表中,可以供我们继续使用

1.6K20

JVM内存与垃圾回收篇第10章对象的实例化内存布局与访问定位

clone():不调用任何的构造器,要求当前的类需要实现Cloneable接口中的clone方法 使用序列化:序列化一般用于Socket的网络传输 第三方库 Objenesis 1.2、对象创建的步骤...如果实例成员变量是引用变量,仅分配引用变量空间即可,即4个字节大小 如果内存规整:采用指针碰撞分配内存 如果内存是规整的,那么虚拟机将采用的是指针碰撞法(Bump The Point)为对象分配内存...标记压缩(整理)算法会整理内存碎片,堆内存一存对象,另一边为空闲区域 如果内存规整 如果内存不是规整的,已使用的内存和未使用的内存相互交错,那么虚拟机将采用的是空闲列表为对象分配内存。...失败重试保证更新的原子性 每个线程预先分配TLAB - 通过设置 -XX:+UseTLAB参数来设置(区域加锁机制) 在Eden区给每个线程分配一块区域 ---- 4、初始化分配到的内存 所有属性设置默认值,保证对象实例字段在赋值可以直接使用...缺点:在堆空间中开辟了一块空间作为句柄池,句柄池本身也会占用空间;通过两次指针访问才能访问到堆中的对象,效率低 优点:reference中存储稳定句柄地址,对象被移动(垃圾收集时移动对象很普遍)时只会改变句柄中实例数据指针即可

23210

Java枚举的values方法是拷贝操作,你知道吗?

创建类型为Type的实例,new Type("T1", 0),赋值给静态变量T1。 2. 创建类型为Type的实例,new Type("T2", 1),赋值给静态变量T2。 3....创建类型为Type数组,并将静态变量T1、T2依次放到数组中,然后再将该数组赋值给静态变量 $VALUES。...javac还为该枚举类生成了一个values方法,这个values方法就是本文要讲的方法,我们具体看下其操作: 1. 获取静态变量$VALUES。 2. 调用$VALUES的clone方法。...将clone方法返回的对象强转成Type数组。 4. 返回该数组。 由此我们可以看到,values方法的确是拷贝操作。 上文我们说到,values等方法是javac动态生成的,是这样吗?...我们还是通过源码确认下这个疑问。

1.8K20

面向对象程序设计

这意味着一个类可以全面地改变存储数据的方式,只要仍旧使用同样的方法操作数据,其他对象就不会知道或介意所发生的变化。 --- 为了实现封装这个特性,需要程序设计语言提供一定的语法机制支持。...对 d 调用更改器方法就可以自动地改变这个雇员对象的私有状态。 如果域访问器方法、域更改器方法需要返回一个可变对象的引用,应该首先对对象进行克隆(clone)。...可以改变类的内部实现,除了该类的方法之外,不会影响其他的代码。 更改器方法可以执行错误检查,而直接对实例域进行赋值将不会进行这些处理。例如,setSalary 方法可以检查薪水是否小于 0。...实际上,抽象这个特性是非常容易实现的,并不需要非得依靠接口类或者抽象类这些语法机制支持。换句话说,并不是说一定要为实现类抽象出接口类,才叫作抽象。即便编写接口类,单纯的实现类本身就满足抽象特性。...比如 Java 使用 extends 关键字实现继承,C++ 使用冒号实现继承(class B : public A),Python 使用 parentheses() 实现继承,Ruby 使用 <

1.9K120

通过 .gitlab-ci.yml配置任务

.gitlab-ci.yml 从7.12版本开始,GitLab CI使用YAML文件(.gitlab-ci.yml)管理项目配置。该文件存放于项目仓库的根目录,它定义该项目如何构建。...Job variables 在job中是可以使用关键字variables定义job变量。它的运行原理跟global-level是一样的,但是它允许设置特殊的job变量。...如果没有设置,将从项目中使用默认值。 可以设置的值有:clone,fetch,和none。 clone是最慢的选项。它会从头开始克隆整个仓库,包含每一个job,以确保项目工作区是最原始的。...当GIT_STRATEGY设置为clone或fetch时,可以使用GIT_CHECKOUT变量指定是否应该运行git checkout。如果没有指定,它默认为true。...GIT_SUBMODULE_STRATEGY变量用于在构建之前拉取代码时,Git子模块是否或者如何被引入。

5.5K20

Java构造函数没有返回值,是怎么赋值的?

实例初始化方法只能在实例的初始化期间,通过 Java 虚拟机的 invokespecial 指令调用, 只有在实例正在构造的时候,实例初始化方法才可以被调用访问。...局部变量表表示方法调用时候的参数传递,当一个实例方法被调用的时候,第0个局部变量存储了当前实例方法所在对象的引用(this),后续的其他参数传递至1到N的连续位置。...以上面测试代码的方法来看Test t = new Test() 的调用过程: new 创建Test对象,并将其引用值压入操作数栈顶 dup 复制栈顶数值并将复制值压入栈顶 invokespecial 使用...dup复制的引用并用来初始化,此时栈顶应该只有new创建的原始引用 astore_1 将new创建的引用存入局部变量表索引为1的位置 return 方法正常返回 ?...从这个过程我们已经看出来了,整个过程最后我们最终拿到了new之后创建的对象引用,并且保存到局部变量表中,可以供我们继续使用

2K00

构造函数没有返回值是怎么赋值的?

实例初始化方法只能在实例的初始化期间,通过 Java 虚拟机的 invokespecial 指令调用, 只有在实例正在构造的时候,实例初始化方法才可以被调用访问。...局部变量表表示方法调用时候的参数传递,当一个实例方法被调用的时候,第0个局部变量存储了当前实例方法所在对象的引用(this),后续的其他参数传递至1到N的连续位置。...以上面测试代码的方法来看Test t = new Test() 的调用过程: new 创建Test对象,并将其引用值压入操作数栈顶 dup 复制栈顶数值并将复制值压入栈顶 invokespecial 使用...dup复制的引用并用来初始化,此时栈顶应该只有new创建的原始引用 astore_1 将new创建的引用存入局部变量表索引为1的位置 return 方法正常返回 ?...从这个过程我们已经看出来了,整个过程最后我们最终拿到了new之后创建的对象引用,并且保存到局部变量表中,可以供我们继续使用

1.7K20

C#中的深复制和浅复制(在C#中克隆对象)

如何来划分它们? 以它们在计算机内存中如何分配划分 值类型与引用类型的区别? 1,值类型的变量直接包含其数据, 2,引用类型的变量则存储对象引用。...堆(heap)是用于为类型实例(对象)分配空间的内存区域,在堆上创建一个对象, 会将对象的地址传给堆栈上的变量(反过来叫变量指向此对象,或者变量引用此对象)。...(内容相同)的字段,也就是说这个引用和原始对象的引用是不同, 我们改变新         对象中这个字段的时候是不会影响到原始对象中对应字段的内容。...浅复制: 实现浅复制需要使用Object类的MemberwiseClone方法用于创建一个浅表副本 深复制: 须实现 ICloneable接口中的Clone方法,且需要需要克隆的对象加上[Serializable...(内容相同)的字段,也就是说这个引用和原始对象的引用是不同, 我们改变新对象中这个字段的时候是不会影响到原始对象中对应字段的内容。

45510

Linux进程是如何创建出来的?

也能学习到内核在保存已经使用的 pid 号时是如何优化内存占用的。我们展开今天的拆解!...不过我们先不着急介绍它,先拿多进程服务中的一个经典例子 - Nginx,来看看他是如何使用 fork 创建 worker 的。...整个进程的虚拟地址空间部分都是由它表示的。 进程在运行的时候,在用户态其所需要的代码,全局变量数据,以及 mmap 内存映射等全部都是通过 mm_struct 进行内存查找和寻址的。...注意:飞哥用的内核源码一直是 3.10.0, 所以本文也例外。不同版本的源码这里稍微可能有些出入。...回顾我们开篇提到的一个问题:操作系统是如何记录使用过的进程号的?在 Linux 内部,为了节约内存,进程号是通过 bitmap 管理的。

2K20

Java提高篇——对象克隆(复制)

如何实现克隆 浅克隆和深克隆 解决多层克隆问题 总结 假如说你想复制一个简单变量。...第二次声明表明,原始和克隆的对象应该具有相同的类类型,但它不是强制性的。 第三声明表明,原始和克隆的对象应该是平等的equals()方法使用,但它不是强制性的。...那么我把这个对象的临时属性一个一个的赋值给我新new的对象也行嘛?可以是可以,但是一麻烦不说,二,大家通过上面的源码都发现了clone是一个native方法,就是快啊,在底层实现的。...我们在main方法中试着改变addr实例的地址。...(如果引用类型里面还包含很多引用类型,或者内层引用类型的类里面又包含引用类型,使用clone方法就会很麻烦。这时我们可以用序列化的方式实现对象的深克隆。)

87730

Java对象的深克隆与浅克隆(对象复制)

改变stu2实例的number字段,再打印结果看看: stu2.setNumber(54321); System.out.println("学生1:" + stu1.getNumber());...第二次声明表明,原始和克隆的对象应该具有相同的类类型,但它不是强制性的。 第三声明表明,原始和克隆的对象应该是平等的equals()方法使用,但它不是强制性的。...而通过clone方法赋值的对象跟原来的对象时同时独立存在的。 如何实现克隆 浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制,下面将对两者进行详细介绍。...(如果引用类型里面还包含很多引用类型,或者内层引用类型的类里面又包含引用类型,使用clone方法就会很麻烦。这时我们可以用序列化的方式实现对象的深克隆。)...解决多层克隆问题 如果引用类型里面还包含很多引用类型,或者内层引用类型的类里面又包含引用类型,使用clone方法就会很麻烦。这时我们可以用序列化的方式实现对象的深克隆。

3K42

Rust实战系列-生命周期、所有权和借用

在上一份完整示例代码中,唯一的改变是将卫星变量包裹在自定义类型中,而 Rust 中的原始类型默认实现了一些特殊行为(如 Copy 特征)。 实现了 Copy 特征的类型能够被复制,否则会失败。...当修改后的 check_status() 函数与新的 main() 一起使用时,可以看到 CubeSat 对象的所有权又回到了原始变量。...以下是地面站结构的定义: struct GroundStation; 创建地面站实例: GroundStation {}; 在不需要所有权的地方使用引用(&) 使用 Rust 编程时,最常见的改变是减少对高访问级别的要求...通常推荐这样做,但在某些情况下也是需要的。原始类型(例如:整数)是个很好的例子。...通常,简单地取消对 self 的引用 (2)使用 Clone 和 Copy 已经实现了 Clone 和 Copy,接下来看看如何使用

1.6K20

详解RuntimeError: one of the variables needed for gradient computation has been mo

然而,有些操作可能会改变变量的值,并且需要在计算图中记录这种改变。但是,如果我们进行原地(inplace)操作,实际上会改变原始变量,从而破坏了计算图的完整性,导致无法正确计算梯度。...具体而言,就地操作是指在创建新的变量副本的情况下直接修改变量的值。例如,我们可以使用+=、-=、*=等操作改变量。在这些操作中,原始变量的内存地址保持不变,只是其值发生了改变。...这样做会创建新的张量,而不会改变原始变量。2. 使用原始操作的副本如果我们需要在原地操作中进行梯度计算,可以使用原始操作的副本进行替代。...例如,使用torch.clone()方法创建变量的副本,然后进行就地操作。...梯度可以指示我们应该如何调整模型参数,以最小化损失函数,并使模型更好地适应训练数据。 在深度学习中,我们使用梯度下降算法更新模型参数。

68410

画说 Ruby 与 Python 垃圾回收

最近Ruby社区发表了一篇博文,是关于如何通过更改Ruby GC设置为单元测试提速的。我认为这篇文章是极好的。...尽管由于许多原因Python也使用可用列表(用来回收一些特定对象比如 list),但在为新对象和变量分配内存的方面Python和Ruby是不同的。 例如我们用Pyhon创建一个Node对象: ?...请注意我一直在为变量n1赋新值,Ruby把旧值留在原处。"ABC","JKL"和"MNO"三个Node实例还滞留在内存中。Ruby不会立即清除代码中不再使用的旧对象!...上面Python回收了ABC Node实例使用的内存。记住,Ruby弃旧对象原地于不顾,也释放它们的内存。 Python的这种垃圾回收算法被称为*引用计数*。...但更糟糕的是,每个简单的操作(像修改变量或引用)都会变成一个更复杂的操作,因为Python需要增加一个计数,减少另一个,还可能释放对象。 第二点,它相对较慢。

68410
领券