Ruby中的&(和号)用于处理和调用方法的目的

前端之家收集整理的这篇文章主要介绍了Ruby中的&(和号)用于处理和调用方法的目的前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我注意到很多关于 Ruby Procs的例子有以下的&象征在它
# Ruby Example
shout = Proc.new { puts 'Yolo!' }

def shout_n_times(n,&callback)
  n.times do
    callback.call
  end
end

shout_n_times(3,&shout)
# prints 'Yolo!' 3 times

我的问题是&符号?看来,如果我写了没有& amp;相同的确切代码,它的工作原理:

# Same code as prevIoUs without &
shout = Proc.new { puts 'Yolo!' }

def shout_n_times(n,callback)
  n.times do
    callback.call
  end
end

shout_n_times(3,shout)
# prints 'Yolo!' 3 times

解决方法

This article提供了很好的差异概述.

为了总结这篇文章,Ruby允许隐式和显式的块.此外,Ruby具有block,proc和lambda.

你打电话时

def foo(block)
end

块只是方法的简单参数.参数在变量块中引用,并且如何与它进行交互取决于您传递的对象的类型.

def foo(one,block,two)
  p one
  p block.call
  p two
end

foo(1,2,3)
1
NoMethodError: undefined method `call' for 2:Fixnum
    from (irb):3:in `foo'
    from (irb):6
    from /Users/weppos/.rvm/rubies/ruby-2.1.5/bin/irb:11:in `<main>'

foo(1,Proc.new { 1 + 1 },3)
1
2
3

但是当你使用&符号在方法定义中,块具有不同的含义.您正在明确定义一个接受块的方法.并且其他规则将适用(例如每个方法不超过一个块).

def foo(one,two,&block)
  p one
  p block.call
  p two
end

首先,作为一个块,方法签名现在接受“两个参数和一个块”,而不是“三个参数”.

foo(1,Proc.new { "from the proc" })
ArgumentError: wrong number of arguments (3 for 2)
    from (irb):7:in `foo'
    from (irb):12
    from /Users/weppos/.rvm/rubies/ruby-2.1.5/bin/irb:11:in `<main>'

这意味着,您必须强制第三个参数是将参数与&符号传递的块.

foo(1,&Proc.new { "from the proc" })
1
"from the proc"
2

但是,这是一个非常不寻常的语法.在Ruby中,具有块的方法通常使用{}

foo(1,2) { "from the block" }
1
"from the block"
2

或者做结束.

foo(1,2) do
  "from the block"
end
1
"from the block"
2

我们回到方法定义.我之前提到以下代码是一个显式的块声明.

def foo(one,&block)
  block.call
end

方法可以隐式接受一个块.隐性块被称为产量.

def foo(one,two)
  p yield
end

foo(1,2) { "from the block" }

可以使用block_given检查块是否通过?

def foo(one,two)
  if block_given?
    p yield
  else
    p "No block given"
  end
end

foo(1,2) { "from the block" }
 => "from the block"

foo(1,2)
 => "No block given"

如果您将“块”声明为简单参数(因此没有&符号),则这些块相关功能将不可用,因为它只是一个无效的方法参数.

原文链接:https://www.f2er.com/ruby/272211.html

猜你在找的Ruby相关文章