Experiment

梳理知识时,用自己习惯的语言把要点重新描述一遍,即便不那么准确全面,通过语言描述这个过程本身已经更充分地调动起大脑处理相关信息,而帮助更好地理解记忆。

每个人的语言习惯、描述方式、知识背景不同,看其他人的解释有时候不那么容易理解。这种情况下自己做一点小试验,把语言/例子/模型转换为自己熟悉的,比较不同代码运行的结果更清晰直接。

Rails

刚开始接触 Rails 时确实如大家所说那样感觉有很多魔法,看代码一般也能理解是什么意思,比如 has_many :posts 很直观,但却不明白基本机理。

后面想到 Rails 是用 Ruby 实现的框架/DSL,很多时候以单纯的 Ruby 代码来理解会清晰一些,除开命名约定,这些魔法多是省略参数外面括号的方法调用,开头是一或多个 symbol 参数,后面是一组可选哈希参数,然后 Rails 在背后处理复杂业务逻辑。

Routes 里 resources :models 是生成对应规则;migration 文件是用 Ruby 代码来设置数据库,migrate 就是执行这些脚本。视图里面的 Helper 方法也是,最终返回给浏览器的是 HTML 代码,这些辅助方法就是生成相应 HTML 代码。

Rails 中 session 是在 sessions table 里创建一串随机字符作为 key,把设置的 sessions 作为值存储进去,再把 key 加密后存储到浏览器 cookies 里。

Routes 用接收到的 HTTP 方法和 URL 查找相匹配的 controller, action,然后把所有参数放进 params 一起送到 controller。

一些术语直译过来不那么容易理解,通过其实际作用来描述更容易理解:

The Asset Pipeline 先是对应预处理器把 SCSS/coffee 文件转编译成对应的 CSS/js 文件,再把这些文件合并、压缩成一个对应格式的大文件返回给浏览器。

ActiveRecord::Relation 是 Active Record 查询界面的一个中间层。使用 where, scope 等进行查询时所有可链接的方法先以某种形式的参数被保存进对应实例化的 Relation,在真正使用具体数据时这些参数被传递给 Arel 生成相应的 SQL 查询,后面把得到的结果实例化为相应对象返回。

Ruby

类方法可以使用其他类方法和类变量,但不能使用实例方法和实例变量;
实例方法可以使用其他实例方法和实例变量,以及类方法和类变量。

public vs protected vs private

三种声明从左到右调用方式越来越严格:

public 方法看到有描述是能被所有人调用,一开始不是很明白具体指什么,后面了解是指能被所有可能的方式调用,能直接被实例对象调用、在类或子类定义里被其他方法以显式或隐式接收者调用。

protected 和 public 相比,不能直接被实例对象调用。

private 则只能在类或子类定义里被其他方法以隐式接收者调用(除赋值方法需要 self 以区分本地变量)。

Block vs Proc vs Lambda

都属于某种形式的闭包/匿名函数,从左往右越来越接近真正的函数。

被作为参数传递到其他函数,常用来对遍历(#each)的项目进行操作;覆盖默认处理方式(#sort)。

Lambdas 可以使用显式 return, blocs / Procs 只能用隐式 return。

带参数时,Lambdas 会检查参数数目,如果数目不对会报错;blocs / Procs 如果没有提供参数返回 nil,多余的参数则被忽略掉。

Procs 和 Lambdas 为 Proc 类的实例,属于对象而可以赋值给变量,blocks 就只是一段代码。