基础知识重要吗
昨天继续恶补 Ruby 的基础知识。近期的接收知识密度比较大,脑袋时常处于兴奋状态。
一些知识点
记录近期学到的一些重要知识点如下
- Everything is objects. 一切皆为对象。在 Ruby 里面全是对象,怎么理解呢?
- 首先,面向对象编程(Object-oriented programming, OOP)是一种编程的设计模式。每个对象都有属性(attribute)和方法(method)。如果用人来打比方,将人作为一个对象的话,人的特征就是属性,人的行为,或者说人能做的事情,就是方法。
- 面向对象编程的三原则是,多态性、数据抽象和继承。
- 多态性的意思是,对于可以不同种类的对象而进行适当的处理。比如说对于字符串的
+
运算和数字的+
运算虽然用的方法都是+
,但其实具体的内在行为是不一样的。对于同一种方法,编程语言能根据不同的数据类型从而采取适当的处理,就是多态性。 - 多态性能让程序更多的去注重 what ,而不是过多去关心 how。
- 对于最简单的
a + 2
这样的运算式用面向对象来理解,a
是一个对象,+
是a
对象的一个方法(method),而2
是+
这个方法的参数。
- 动态语言的特点
- 动态语言最大的优点是代码简洁,生产力高。
- 动态语言的缺点主要是,执行时才能发现错误(可以用完备的测试来补救),程序代码难读(建立完备的文档),运行速度慢(随着计算硬件的性能提高,这已经不是主要矛盾,更重要的是程序的灵活性和生产力)
- 在 Ruby 中,对于布尔判断,
nil
和false
带有否
的意思,其余所有都是是
。 - 要注意运算符的优先级问题,
&&
、||
、!
的含义分别和and
、or
、not
是一样的,即逻辑与、或和否。但是由于它们的优先级不一样,会导致看似相同的代码运行结果不一样,例如下面的例子。得到结果是a = 3
和b = 5
。这是因为,&&
的优先级比=
高,5 && 3
的结果是3
。而and
的优先级比=
低,所以第二句代码是先把5
赋予给了b
,第二步执行的是(b = 5) and 3
,b
并没有被重新赋值。
a = 5 && 3
b = 5 and 3
- Symbol 和 String 的区别
- Symbol 可以看做是 String 的一个补充;
- 最大的区别是,对于相同名字的一个 Symbol,它的内存地址,也就是 Objective_id 是不变的,而 String 每次重新赋值之后都会发生变化;
- Symbol 更节省内存;
- Symbol 一般用于不频繁变化的情况,比如说常量,或者作为 Hash 里的 key。
- 一个对象被定义之后,在内存的储存可以看做有两部分,一部分是
内容
本身,另一部分是引用地址
。对于 一个 String 来说,同样的内容,只要重新赋值,引用地址
就会发生变化,也就是说变成了一个新的对象。用replace
方法只改变内容
,而引用地址
不变,对于内存储存地址来说,还是原来那个对象。如下面的例子:
2.3.1 :011 > a = "Hello"
=> "Hello"
2.3.1 :012 > a.object_id
=> 70246900461240
2.3.1 :013 > a = "Hello"
=> "Hello"
2.3.1 :014 > a.object_id
=> 70246896219140
2.3.1 :015 > b = "Hello"
=> "Hello"
2.3.1 :016 > b.object_id
=> 70246896235300
2.3.1 :017 > b.replace "World"
=> "World"
2.3.1 :018 > b.object_id
=> 70246896235300
一些体会
对于学习方法,还是有很多人在强调「要从基础学起」。但事实证明,从基础学起的效率特别低下,失败率非常高,不是一种可取的学习方法。更高效的学习是,直接上手实践,通过大量的实践迅速建立整体概念。
但这并不是等同于说「基础知识不重要」。如果仅仅懂得如何操作,那充其量只是一个「技工」而已。要理解基本原理,才有可能对技能有「创造性的运用」。
在一定量的实践之后,是应该去补充基础知识。这个时候,由于有了实践的经验,基本原理的学习会变得非常高效,常常会有「秒懂」的感觉。这跟零基础的时候去啃「基础知识」完全不是一个概念。
所有技能都没有「速成」这回事,但是「快速入门」是可以做到的。目的就是减少前期的盲目摸索,快速进入有效积累的阶段。
学习就像拼图,一边实践一边查漏补缺才是更高效的路径。
今天继续去图书馆。