我可以看到代码块作为迭代器方法的参数(每个/ ...)?

时间:2011-06-19 03:00:23

标签: ruby codeblocks

我是ruby中的新手,我对代码块和参数感到困惑。

例如:

"This@is@a @tring".split("@")

在此代码中,“This is a string”是 String 对象, split 是字符串对象的方法,“@”是拆分方法的参数。

这很清楚,因为它与其他程序语言相同。

但是当我看到代码块时:

[1,2,3].each {|data| puts data}

[1,2,3]是数组对象,每个是其方法之一(对吗?)。

代码块在这里:

{|data| puts data}

我将它理解为匿名函数,在javascript中,它可能是这样的:

function(data){ puts data}

所以我认为可以使用代码块作为每个方法的参数。所以我试试这个:

[1,2,3].each ({|data| puts data})

我只是添加了大括号,但它显示了一些错误。

为什么?

有人能告诉我更多关于ruby中的代码块吗?

2 个答案:

答案 0 :(得分:3)

该块是Ruby语法的特殊部分。与Ruby中的大多数东西不同,它不是一个对象,也不是正常意义上的函数的参数:方法只能接受一个块,它必须在参数列表之后。因此,在最后一个示例中,括号表示参数列表。将块放在该列表中会违反Ruby语法。

但是,如果你对基本上绕过街区感兴趣,那么你可以。看一下Proc类,它有点像块的代理对象。创建Proc对象时,它接受块参数。 #call上的Proc方法将其参数传递给该块。

print_twice = Proc.new { |x| puts x; puts x }
print_twice.call(1) # prints 1 twice
print_twice.call(2) # prints 2 twice
print_twice.call(3) # prints 3 twice

此外,使用特殊语法,Proc可用作方法调用的块:

print_twice = Proc.new { |x| puts x; puts x }
[1, 2, 3].each(&print_twice)

这相当于:

[1, 2, 3].each { |x| puts x; puts x }

作为&print_twice的最终参数的each基本上将其作为块传递。而且,由于print_twice是它自己的对象,你可以将它传递给任意数量的方法。

希望这有点帮助! :)

答案 1 :(得分:0)