Ruby 如何提出论点

Ruby 如何提出论点,ruby,yield,Ruby,Yield,此方法复制了map方法,以便更深入地了解yield的工作原理 我研究了yield,但我不明白为什么它将迭代元素作为参数 我知道yield检索一个块,但这里到底生成了什么,为什么需要一个参数 下面的代码是正确的: def my_map(array) new_array = [] array.each do |element| new_array << yield(element) end new_array end def my_映射(数组) 新的_数组=

此方法复制了
map
方法,以便更深入地了解
yield
的工作原理

我研究了
yield
,但我不明白为什么它将迭代元素作为参数

我知道
yield
检索一个块,但这里到底生成了什么,为什么需要一个参数

下面的代码是正确的:

def my_map(array)

  new_array = []
  array.each do |element|
    new_array << yield(element)
  end

  new_array
end
def my_映射(数组)
新的_数组=[]
数组。每个do |元素|
新的数组
yield(element)
element
传递给提供给
my\u map
方法的块

my_map([1,2,3]) {|element| element*2}
块正在接收
元素
作为您从
屈服(元素)
传递的输入

考虑另一个例子来帮助澄清:

def simple_yield(arg)
  yield(arg)
end
现在如果你这样做了:

simple_yield(10){|x| puts x} #=> 10
simple_yield(){|x| puts x} #=>nil

yield(arg)
将参数生成给该方法的块。

如果不通过yield方法将任何参数传递给块,则该参数将具有nil值,根据您在传递给使用yield的方法的块中所做的操作,该值可能会导致错误

def my_map(array)
  new_array = []

  array.each do |element|
    new_array << yield
  end

  new_array
end

my_map([1,2]) { |x| x } #=> [nil, nil]
my_map([1,2]) { |x| x + 1 } # will end up with undefined method `+' for nil:NilClass (NoMethodError)
def my_映射(数组)
新的_数组=[]
数组。每个do |元素|
新_数组[nil,nil]
我的_映射([1,2]){| x | x+1}#将以nil:NilClass(NoMethodError)的未定义方法“+”结束

yield
不“检索块”,它将(可能带有一个值,如本例中所示)生成块,并“返回”所述块返回的值

它“接受”迭代元素,因为
my_map
需要一个接收参数的块

我尝试了大量的研究
yield
,但我不明白为什么在这种情况下,它将迭代元素作为参数


yield
不接受参数。块接受。
yield
向块生成值

我知道
yield
检索块

不,它将控制(和值)产生到块

但这里到底是什么,为什么需要争论


元素
引用的对象与控制流一起屈服于块。

调用
屈服
与调用
块是一样的。调用
。因此
屈服
使用参数调用块。就是这样

(可以将块视为迷你方法。)

然而,在您的方法中,您并没有明确地说它接受一个块(
defmy_-map(array,&block)
),但它隐式地这样做

因此,您的实现(只需稍加重写)相当于:

def my_map(array, &block)  # added &block

  new_array = []
  array.each do |element|
    new_array << block.call(element)   # changed for block.call
  end

  new_array
end
def my_映射(数组和块)#添加和块
新的_数组=[]
数组。每个do |元素|

新数组请在提问或回答时使用正确的标点符号/语法。Stack Overflow不是一个讨论组或论坛,在那里这些都不重要。相反,它是一本参考书,像百科全书或烹饪书。谢谢,我将在下一次开始处理此问题。