Ruby 《Ruby 元编程》读书笔记 (七)

lazybios · September 14, 2015 · Last by lazybios replied at June 26, 2016 · 2577 hits

博客地址 :《Ruby 元编程》读书笔记 (七)

相关文章:

《Ruby 元编程》读书笔记 (一) 《Ruby 元编程》读书笔记 (二) 《Ruby 元编程》读书笔记 (三) 《Ruby 元编程》读书笔记 (四) 《Ruby 元编程》读书笔记 (五) 《Ruby 元编程》读书笔记 (六)

传神的头图↓↓↓

Ruby元编程

单件方法

Ruby 允许给单个对象增加方法,这种只针对单个对象生效的方法,称为单件方法

示例代码
str = just a regular string

def str.title?
    self.upcase == self
end

str.title?  # => false
str.methods.grep(/title?/) # => [:title?]
str.singleton_methods   #=> [:title?]

str.class # => String
String.title?  #=>  NoMethodError

另外,除了上面使用的定义方法,还可以通过Object#define_singleton_method方法来定义单件方法

单件方法与类方法

前面的笔记中有说道在 Ruby 中类也是对象,而类名只是常量,所以,在类上调用方法其实跟在对象上调用方法一样:

类方法的实质是:它是一个类的单件方法,实际上,如果比较单件方法的定义和类方法的定义,会发现其实二者是一样的

def obj.a_singleton_method; end
def MyClass.another_class_method; end

二者均使用了 def 关键词做定义

def object.method
    #方法主体
end

上面的 object 可以是*对象的引用、常量类名或者 self。

类宏 attr_accessor

Ruby 对象没有属性,如果希望得到一些像属性的东西,需要分别定义一个读方法和写方法(也就是 java、objc 中的 set 和 get 方法),最直接的可以这样:

示例代码
class MyClass
    def my_attribute=(value)
        @my_attribute =value    
    end
    def my_attribute
        @my_attribute
    end
end

obj = MyClass.new
obj.my_attribute = x
obj.my_attribute    #=> ‘x’

但是上面这种写法,如果属性众多的话就会存在 Repeat Yourself 的地方,这时就可以用到下面三个类宏:

  • Module#attr_reader 生成一个读方法
  • Module#attr_writer 生成一个写方法
  • Module#attr_accessor 同时生成读方法和写方法 ##### 示例代码 ruby class MyClass attr_accessor :my_attribue end

这样是不是就简洁多了呢?当然,使用方法 (读与写) 跟上面的实现是一致的。

-待续-

=============== 最后贴一下自己的公众账号

可以十日不将军,不可一日不拱卒,日拱一卒 (rigongyizu365)

lazybios in 《Ruby 元编程》读书笔记 (八) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (九) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (十) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (十一) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (十二) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (十三) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (十四) mention this topic. 26 Jun 10:50
lazybios in 《Ruby 元编程》读书笔记 (十五) mention this topic. 26 Jun 10:50
You need to Sign in before reply, if you don't have an account, please Sign up first.