我前几天将下面显示的错误介绍到我的代码中,并希望更好地理解其含义。
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
我想了解第一个例子的行为。我的假设是否正确,因为该块基本上是匿名的,并且没有执行,因为没有任何名称?
答案 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中的任何方法,即使是不期望它的方法。