我是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中的代码块吗?
答案 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)