这两段代码难道不等价吗?为什么呢?

这两段代码难道不等价吗?为什么呢?

SRC = FileList['*.c']
SRC.each do |fn|
 obj = fn.sub(/\.[^.]*$/, '.o')
 file obj do
  sh "cc -c -o #{obj} #{fn}"
 end
end
.....................
SRC = FileList['*.c']
SRC.each do |fn|
 obj = fn.sub(/\.[^.]*$/, '.o')
 sh "cc -c -o #{obj} #{fn}"
end

这两段代码难道不等价吗?为什么呢?
我对file ... do这个结构不太理解。
没有上下文吗?
其中上面一段代码来自:http://docs.rubyrake.org/read/chapter/3#page13

下面一段是我自己的想法。主要是file ... do ... end这个结构在这里是干什么的?我不明白。

在这里我看不出file是个什么东西,明显的不可能是个变量,所以应该是个方法。这个方法接收一个参数obj和一个block. do .. end之内的就是一个block.
file(args, &block)
Declare a file task.

Example:

[Copy to clipboard] [ - ]
Use a Ruby do / end block to capture actions …
是个一个block块,在群里你不是说你明白了吗?你不是说你去看看什么叫块?
我的理解:
SRC = FileList['*.c']
SRC.each do |fn|
 obj = fn.sub(/\.[^.]*$/, '.o')
 file obj do
  sh "cc -c -o #{obj} #{fn}"
 end
end
这段代码就相当于为每一个.c文件定义了一个file task,然而这里并没有依赖,只有动作。
即如果该目录下只有两个.c文件:main.c,greet.c,那这段代码就等价于:
file "main.o" do
 sh "cc -c -o main.o main.c"
end
file "greet.o" do
 sh "cc -c -o greet.o greet.c"
end
如果是这样,这段代码就相当于将以下定义进行拆分的一部分:
file 'main.o' => ['main.c', 'greet.h']
 sh "cc -c -o main.o main.c"
end
file 'greet.o' => ['greet.c']
 sh "cc -c -o greet.o greet.c"
end
拆分为:
file "main.o" do
 sh "cc -c -o main.o main.c"
end
file "greet.o" do
 sh "cc -c -o greet.o greet.c"
end # -----------------------------------------------就是这一部分

file 'main.o' => ['main.c', 'greet.h']
file 'greet.o' => ['greet.c']

这样理解是否正确呢?

[ 本帖最后由 allforlove 于 2007-8-2 16:44 编辑 ]
惭愧...,回来还是没看明白。
还是直接看看人家的源代码吧