Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby中,什么是&;块;做_Ruby - Fatal编程技术网

在ruby中,什么是&;块;做

在ruby中,什么是&;块;做,ruby,Ruby,可能重复: 我不理解&block部分,它是做什么的 以下是一个例子: def method_missing(method_name, *args, &block) @messages << method_name @object.send method_name, *args, &block end def method_缺少(method_名称、*args和block) @消息块使您有机会声明要传递给方法的回调 和在这里是键,就像前面提到的@pst一样,

可能重复:

我不理解
&block
部分,它是做什么的

以下是一个例子:

def method_missing(method_name, *args, &block)
  @messages << method_name
  @object.send method_name, *args, &block
end
def method_缺少(method_名称、*args和block)

@消息
使您有机会声明要传递给方法的回调

在这里是键,就像前面提到的@pst一样,它将块“升级”到Proc,并将Proc绑定到具有给定名称的变量

def time(&block)
  puts block
end

time
# => nil
time { foo }
# => #<Proc:0x00029bbc>
def time(block)
  puts block
end

time { foo }
# => ArgumentError: wrong number of arguments (0 for 1)
# Because & isn't included, the method instead expected an arguement,
# but as a block isn't a arguement an error is returned.

它将块转换为可传递给另一个方法的proc对象。

当使用块调用方法时,有两种方法可以使用该块:

  • 调用
    yield
    内部方法
  • 通过在
    &
    前面加上前缀,将其转换为
    Proc
    对象
使用第二种方法,您可以将其传递给另一个方法

因此,在您的例子中,它将给定的块转换为
Proc
,并用它调用
method\u name

想象一下,你可以像传递任何参数一样传递一个块。

回答“我如何将它传递给另一个方法?”Brian的评论:

像这样:

def compose init_value, n=2, &b
  if n==0 then init_value else
    b.call( compose init_value, n - 1, &b )
  end
end

compose 2 do |n| n * n end
#=> 16
compose 2, 4 do |n| n * n end
#=> 65536
compose 2, 4 do |n| n * 0.5 end
#=> 0.125
这是一种递归方法,它将同一块递归地应用于一个数多次。在这里,打包到
b
参数中的块被调用,但同时它被递归地传递到
compose
方法,而
n
参数递减1。同样地,
b
可以传递给任何方法,如
map
reduce
,任何方法

然而,如果您不需要将块传递给另一个方法,您可以简单地使用
yield

def apply_block_to_1_2_3
  return yield( 1 ), yield( 2 ), yield( 3 )
end

apply_block_to_1_2_3 { |n| n * n }
#=> [1, 4, 9]

愿原力与你同在。

Daniel,请你展示一个代码示例好吗?这是一个简单的文字解释,在给定的上下文中是足够的,除了有一种替代方法提供一个块作为参数,我不知道,“&”实际上不会将一个块“升级”到一个进程,相反。。。它将现有的进程转换为一个块,因此获取块的方法可以使用它们!(Proc只是一个“已保存”的块),因此您可以创建它:my_Proc=Proc.new{| x |··························。。。然后你可以在一个需要一个块的方法中使用它:@my_collection.each(&my_proc)slivu,你能给我展示一个代码示例吗?好的,最后一行对我来说稍微亮了一点!我如何将它传递给另一种方法?继续学习,布莱恩,我们在这里为你:)谢谢你的支持鲍里斯!:)对不起,我还是不明白。。。另外,我花了30分钟分析你的代码。。。(…我是Ruby新手…)你能展示一些更简单的东西吗?Brian,这很简单。可以想象,您可以在评论中准确地指出您不理解的内容,但坦率地说,如果您在获取此基本代码方面遇到困难,我建议您从开始,然后继续学习Zed Shaw的“艰苦学习Ruby”。