一直对ruby中yield的使用比较迷惑,今天抽了点时间好好看了下,下面是内置类File ::open的源码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 endend这个方法非常简洁明了,block_given?判断是否传递了代码块,有的话就把文件句柄传给代码块进行操作,这个地方就是 yield f我觉得可以这样理解yield的行为:把yield后面的参数传递给后面的代码块作为参数。yield的作用可以这样理解:拿学生举个例子,每个学生交的学费是一样的,所以处理交学费的流程就放在方法中,但是每个学生的要花费的生活费不一样,要考虑很多的因素,所以把特殊的因素放在代码块中操作,这样就可以即统一又有区别的计算出总的花费。
另一个例子
def c(v, &block)
return v unless v.is_a? Array
v.each &block
end
c([1,2,3]) { |x| p x + 1 } #2, 3, 4
v.each { |x| yield x }
2008-07-29 17:54:34, 787 reviews
send to mailbox
just DO NOT support IE