首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ruby中block与&block的区别

Ruby中block与&block的区别
EN

Stack Overflow用户
提问于 2009-09-06 18:04:16
回答 3查看 24.8K关注 0票数 57

为什么有时我应该在接受块的函数中使用block和其他时候&block?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-06 18:20:35

block只是一个局部变量,&block是对传递给该方法的块的引用。

代码语言:javascript
复制
def foo(block = nil)
  p block
end

foo # => nil
foo("test") # => test
foo { puts "this block will not be called" } # => nil

def foo(&block)
  p block
end

foo # => nil
foo("test") # => ArgumentError: wrong number of arguments (1 for 0)
foo { puts "This block won't get called, but you'll se it referenced as a proc." }
# => #<Proc:0x0000000100124ea8@untitled:20>

还可以在调用方法时使用&block将proc作为块传递给方法,这样就可以像使用块一样使用procs。

代码语言:javascript
复制
my_proc = proc {|i| i.upcase }

p ["foo", "bar", "baz"].map(&my_proc)
# => ["FOO", "BAR", "BAZ"]

p ["foo", "bar", "baz"].map(my_proc)
# => ArgumentError: wrong number of arguments (1 for 0)

变量名block并没有什么特别的含义。如果你愿意,你可以使用&strawberries,“&”是这里的关键。

您可能会发现this article很有帮助。

票数 100
EN

Stack Overflow用户

发布于 2009-09-06 18:23:19

在参数列表中,&whatever获取传递给方法的块,并将其包装在Proc对象中。Proc存储在一个名为whatever的变量中(当然,它可以是您在与号后面键入的任何名称-通常是“块”)。在方法调用之后,&whatever语法将进程转换为块。所以如果你像这样定义一个方法:

代码语言:javascript
复制
def thing(&block)
  thing2 &block
end

您正在定义一个方法,该方法接受一个块,然后使用该块调用另一个方法。

票数 27
EN

Stack Overflow用户

发布于 2009-09-06 18:30:09

如果不设置& before块,Ruby将无法识别它与传递给函数的“块”的关系。这里有一些例子。

代码语言:javascript
复制
def f(x, block); end
f(3) { 2+2 }    # gives an error, because "block" is a
                # regular second argument (which is missing)

def g(x, &block); end
g(3) { 2+2 }    # legal

def h(x); end
h(3) { 2+2 }    # legal

为了以后在函数中使用:

代码语言:javascript
复制
def x(&block)   # x is a 0 param function
  y(block)      # y is a 1 param function (taking one "Proc")
  z(&block)     # z is a 0 param function (like x) with the block x received
end

所以,如果你调用z(&block),它是(差一点!)与调用z { yield }相同:只需将块传递给下一个函数。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1386276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档