如何将块传递给子方法?

3

假设我有以下代码:

def a(n, m, &block)
  yield if block_given?
end

def a
  # My question is here. When a is called, block might be or might not be
  # given. Below line is obvious wrong. How to call b and properly pass 
  # block to b?
  b(1, 2, &block)
end

a  # call a without block

a { # call a with a block
    puts "in block"
}

3
您的问题并不清楚。您的第一个函数是否应该被称为“b”?您指示的那行代码显然并没有错误,它是正确的。 - user229044
@meagar 嗯,这行代码很可能是错误的,因为除非有一个叫做block的方法,否则在那里它是未定义的。 - Andrew Marshall
1
请不要将问题写成代码的注释。请将其作为文本编写。 - sawa
重新定义 a 使得第一个定义的 a 变得毫无意义。你没有展示出 b 是什么。不清楚你在做什么。 - sawa
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
10

编写 a() 函数来接受一个块。这是可选的,如果没有提供,则将作为 &nil 传递。

def b(n, m, &block)
  yield if block_given?
  puts "no block" if !block_given?
end

def a( &block )
  b(1, 2, &block)
end

a  # call a without block

a { # call a with a block
    puts "in block"
}

输出:

no block
in block

4
实际上,在a中您不需要条件语句。如果没有给出块,则“block”为“nil”,由于f(&nil)相当于不传递块,因此您可以在任何情况下都将其传递,并且它将按预期工作。(例如:def f █ [block, block_given?]; end; f(&nil) #=> [nil, false]。) - Andrew Marshall
@AndrewMarshall 非常好的观点,谢谢。回答已相应更新。 - Matt
如果加上 puts "no block" unless block_given? 这行代码,Ruby 会更加优美。 :) - Param Siddharth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,