Ruby on rails 红宝石区块(产量)

Ruby on rails 红宝石区块(产量),ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我刚刚开始学习Ruby,我在Bloc的课程中已经有相当长的路要走了,但是现在我被困在了一个关于产量和积木的练习中(我发现这是到目前为止学习Ruby最难掌握的概念) 以下是以纯格式文本显示的所需规格: 定义一个新的映射方法 它应该将一个数组作为参数,并返回一个根据作为块传递的指令修改的新数组 您不能使用.map或.map!方法 但是,可以在方法中随意使用每种方法 您需要将每个块调用的返回值存储在一个新数组中 它应该映射任何对象 以下是需要满足的RSpec: describe "new_map

我刚刚开始学习Ruby,我在Bloc的课程中已经有相当长的路要走了,但是现在我被困在了一个关于产量和积木的练习中(我发现这是到目前为止学习Ruby最难掌握的概念)

以下是以纯格式文本显示的所需规格:

  • 定义一个新的映射方法
  • 它应该将一个数组作为参数,并返回一个根据作为块传递的指令修改的新数组
  • 您不能使用.map或.map!方法
  • 但是,可以在方法中随意使用每种方法
  • 您需要将每个块调用的返回值存储在一个新数组中
  • 它应该映射任何对象

以下是需要满足的RSpec:

describe "new_map" do
  it "should not call map or map!" do
    a = [1, 2, 3]
    a.stub(:map) { '' }
    a.stub(:map!) { '' }

    expect( new_map(a) { |i| i + 1 } ).to eq([2, 3, 4])
  end

  it "should map any object" do
    a = [1, "two", :three]
    expect( new_map(a) { |i| i.class } ).to eq([Fixnum, String, Symbol])
  end
end

以下是他们给我的原始def方法:

def new_map(array)
  new_array = []
  array.each do |item|
    # invoke the block, and add its return value to the new array
  end
end

下面是我当前的代码(已更新):

def新地图(a)
新的_数组=[]
a、 每个do |项目|
#调用该块,并将其返回值添加到新数组中。
产量(项目,新_数组)
结束
结束
a=[2,3,4]
新地图(a)do | i,e|

e
new\u array
是在定义
new\u map
中创建的,它是一个与调用
new\u map
时编写的块不同的“词法范围”。基本上,
new\u map
方法中的代码可以看到
new\u数组
,但块中的代码不能。解决此问题的一种方法可能是查看
可枚举
方法
注入
每个带有对象
新映射
方法中的
每个

您没有意识到的是收益率可以返回一个值。块中最后执行的语句是返回值

def new_map(a)
  new_array = []
  a.each do |item|
    # invoke the block, and add its return value to the new array.
    new_array << yield(item)
  end
  new_array
end
因此,您可以获取每个收益调用的结果,并将其添加到结果数组中

然后,将结果数组作为
new\u map
方法的返回值

def new_map(a)
  new_array = []
  a.each do |item|
    # invoke the block, and add its return value to the new array.
    new_array << yield(item)
  end
  new_array
end
def新地图(a)
新的_数组=[]
a、 每个do |项目|
#调用该块,并将其返回值添加到新数组中。
新建数组尝试以下操作:

def new_map(a)
  new_array = []
  a.each do |item|
    # # invoke the block, and add its return value to the new array.
    puts yield(item) # just experimenting
  end
end

new_map(a) { |i| i + 1 }
这个
yield
thingy只是从数组中获取每个元素,并在块中运行它。这个实验代码只是打印结果;这些数据应该收集在一个数组中。不难:

def new_map(a)
  new_array = []
  a.each do |item|
    new_array = []
    # invoke the block, and add its return value to the new array.
    new_array << yield(item)
  end
end
def新地图(a)
新的_数组=[]
a、 每个do |项目|
新的_数组=[]
#调用该块,并将其返回值添加到新数组中。

新建数组正如它所说的-当您调用
new\u map(a)
时,
a
是未定义的。在调用NexYMMAP之前将其设置为一个初始值。@ CythRead不工作,我在方法定义和方法调用之间设置<代码> A=(1, 2, 3,4)< /代码>,程序现在执行,但我得到<代码>预期:[ 2, 3, 4 ]得到:[]/Cord>还可以更充分地考虑注释文本。步骤1)执行该块。步骤2)将其添加到数组中。非常感谢@SteveTurczyn的完美工作,我对此表示感谢。
def new_map(a)
  new_array = []
  a.each do |item|
    # # invoke the block, and add its return value to the new array.
    puts yield(item) # just experimenting
  end
end

new_map(a) { |i| i + 1 }
def new_map(a)
  new_array = []
  a.each do |item|
    new_array = []
    # invoke the block, and add its return value to the new array.
    new_array << yield(item)
  end
end