需要帮助理解特定的Ruby块

时间:2011-10-22 13:37:46

标签: ruby

我前几天将下面显示的错误介绍到我的代码中,并希望更好地理解其含义。

File.open('test.txt').readlines do |line|
  puts "#{line} test"
end

File.open.readlines完全按预期执行,并返回一个包含文件中所有行的数组。但紧接着该数组就是一个块。 readlines返回的数组不会调用任何成员方法,例如each。我假设该块没有任何调用它,因此它什么都不做。在其他语言中,这可能会抛出编译器警告,或者在C中,块将被视为嵌套范围,并且它将执行。但如图所示,Ruby(1.9.2)运行时没有错误,也没有puts生成的输出。

为了完整性,这里是更正后的版本。

File.open('test.txt').each_line do |line|
  puts "#{line} test"
end 

我想了解第一个例子的行为。我的假设是否正确,因为该块基本上是匿名的,并且没有执行,因为没有任何名称?

1 个答案:

答案 0 :(得分:4)

以下是您的特定示例中发生的情况。当你打电话

File.open('test.txt').readlines do |line|
  puts "#{line} test"
end

该块正在传递给readlines方法。该块不会传递给readlines方法返回的数组。这是一个有效的案例,因此ruby翻译不会抱怨。

这是一个更简单的场景来说明这个

假设我的课程定义如下

 class Foo
     def bar
     end 
 end

现在如果我打电话

 Foo.new.bar {puts "hello"}

解释器不会出错,并且不会打印“你好”。

如果我屈服于栏中的块如下

 class Foo
     def bar
         yield
     end 
 end

然后执行掉货,你应该看到你好打印

 Foo.new.bar {puts "hello"} # prints hello

总结块传递给方法而不是对象,你可以将块传递给ruby中的任何方法,即使是不期望它的方法。