Ruby 中 __set 和 __get 实现
PHP 中有 __set、__get、__call 等方法来实现一些动态的特性,比如动态的对象属性等。
本文讲述 Ruby 中对应这几个方法的实现。
__call对应 Ruby 中method_missing(name, *arguments)__set对应 Ruby 中method_missing(name=)__get对应 Ruby 中method_missing(name)
注意:
method_missing里面的 name 是一个符号,不是字符串。
来验证一下:
先定义一个类,里面只有一个 method_missing 方法
1 | class Person |
- 访问对象属性
1 | p = Person.new |
输出:
1 | name: age |
我们发现上面的 p.age 实际上是执行了
method_missing('age')
- 设置对象属性
1 | p = Person.new |
输出
1 | name: age= |
我们发现 p.age = 23 实际上等同于
method_missing('age', 23)
- 调用一个不存在的方法
1 | p = Person.new |
输出
1 | name: test |