- 论坛徽章:
- 0
|
面向对象的思想在ruby中表现的淋漓尽致,几个特性也是比较难以理解的,这里做个小总结:
1. super
先看例子吧:
- class Father
- def hello
- p 'hello, i am dad'
- end
- end
- class Child < Father
- def hello
- p 'hello, i am son'
- super
- end
- end
- Father.new.hello
- #hello, i am dad
- Child.new.hello
- #hello, i am dad
- #hello, i am son
复制代码
ruby类中方法查找路径为:类实例先查找本类中是否定义了该方法, 然后查找该类中是否include了其他module,该mudule中是否包含了改方法, 然后查找该类的父类中是否有改方法, 然后是父类中是否include了其他module,改mudole中是否包含了其他方法。
在查找的整个过程中如果查找到将会立刻执行并停止向上一级的查找
super可以理解为,按照上面的查找路径再向上一级进行查找, 如果有,就在该处(调用super的逻辑片段中)再执行一遍改匹配该方法名的方法,如果整个查找过程都没有匹配到,将会抛出异常NoMethodError,所以上面的例子就不难理解了, 要注意的是super不是只查找自己父类中的同名方法, 包括module的
另外super也接受参数:
super, 及没有加任何参数时(裸词), 是默认自动向前传递所有该方法所获得的参数
super(), 不向上一级传递任何参数
super(a,b,c), 传递指定的参数
2. <<
<<用来批量定义类或者模块的方法(注意不是实例方法)
下面两段代码的效果是一样
- class As
- def As.hello
- #do something
- end
- end
- class As
- class << self
- def hello
- #do something
- end
- end
- end
复制代码
同理下面两段代码的效果是一样的
- module TimeFormat
- def self.show_time
- #do something
- end
- end
- module TimeFormat
- class << self
- def show_time
- #do something
- end
- end
- end
复制代码
3. yield和block
block在ruby是独有的特性, 其中yeild的使用更是灵活
下面是内置类File : pen的源码
- def File.open(name, mode = "r")
- f = os_file_open(name, mode)
- if block_given?
- begin
- yield f
- ensure
- f.close
- end
- return nil
- else
- return f
- end
- end
复制代码
这个方法非常简洁明了,block_given?判断是否传递了代码块,有的话就把文件句柄传给代码块进行操作,这个地方就是
我觉得可以这样理解yield的行为:把yield后面的参数传递给后面的代码块作为参数。
yield的作用可以这样理解:拿学生举个例子,每个学生交的学费是一样的,所以处理交学费的流程就放在方法中,但是每个学生的要花费的生活费不一样,要考虑很多的因素,所以把特殊的因素放在代码块中操作,这样就可以即统一又有区别的计算出总的花费。
另一个例子
- def c(v, &block)
- return v unless v.is_a? Array
- v.each &block if block_given?
- end
- c([1,2,3]) { |x| p x + 1 } #2, 3, 4
- def c(v)
- return v unless v.is_a? Array
- v.each { |x| yield x } if block_given?
- end
- c([1,2,3]) { |x| p x + 1 } #2, 3, 4
复制代码 |
|