今天重点看了2个内容,引用和模块。
从感觉来看,模块相当简单,引用就极其复杂了。
一个是要搞清楚,哈希到底怎样才算赋值?
另外一个很重要的是要知道,ruby一切都是对象,而对象都是放在堆上面的。而所谓变量,哈希,数组都只是存储了一个指向堆的一个引用。
引用稍微搞不过好就可能搞错对象去。
传一个块给哈希的new方法,其实相对来说是一个很蠢的方法,他其实就是调用了这样的一些语句,每次都生成一个新对象,而且为只要引用了这个键的玩意都赋值这个新对象。
然后引用有几个关键的东西,
数字是不可变的,字符串是可变的,第二个其实和python是不一样的。
然后哈希的默认对象,书中总结了一个一般性的规则,可以用数字,其他就不要用了。除非你知道后果,故意用。
如果你想和数字作为默认对象一样用的话,那你要穿个块过去,而且块里面必须要做这几件事,第一要初始化一个新对象,第二点极其重要,必须给哈希赋值。
完成这2点,应该就没啥问题了。
至于ruby中为什么字符串是可变的,文章开始的时候的图片算是一个例证。
模块是一个有意思的东西,他适用于这样一个场景,当你只想继承某个类的部分方法的时候,你就可以考虑把这些方法放到一个模块中,然后你mix这个模块到你类里就好了。
但是这样产生了代码的复制,你在超类和模块中都有一份相同的代码。
可以的话,应该这样。从超类中删除原来的方法,然后修改老的一些类,让他们也mixi相关的模块。这样的话,对老代码影响还是很大的。
还有一点有意思的是,module方法查找的优先级高于超类,这个还是吓到我了。也许由于类也是一个模块把,虽然我不知道这具体啥意思。
领取专属 10元无门槛券
私享最新 技术干货