gpt4 book ai didi

ruby - 在 Ruby 中将 "Yield"与多个方法一起使用

转载 作者:数据小太阳 更新时间:2023-10-29 08:45:56 25 4
gpt4 key购买 nike

尝试定义一个 new_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

我的代码独立工作,但不能同时满足两个 RSpec。我知道我有两个同名的方法 (new_map),但我不知道如何将两者结合起来。

def new_map(array)
new_array = []
array.each do |item|
new_array << item +1
end
new_array
end

def new_map(array)
new_array = []
array.map do |item|
new_array << item.class
end
new_array
end

感谢您帮助初学者。

最佳答案

这应该有效:

def new_map(array)
new_array = []
array.each do |item|
new_array << yield(item)
end
new_array
end

编辑:顺便说一句,造成麻烦的是您想要映射列表项的特定方式包含在该方法中。我认为更改两者之一的名称是保持其正常工作的唯一方法。

此外,您在调用 new_map() 时提供了 block ,但没有在 new_map() 内部使用它们。

在函数内部,关键字“yield”允许您调用传递给您的函数的 block ,并提供任何值(如果有)。所以正确的想法是在一个 block 中分离精确的映射内容,并从函数内部用列表的每个元素迭代调用它,然后将结果返回到你想要返回的数组。

编辑2:我还想补充一点,如果您只需要具有特定映射方法的特殊映射函数,我建议您改用使用 proc 创建的可重用 block 。示例:

array = [1,2,3]

# Create the mapping you want.
mapping = proc do |item|
item + 1
end

# Now use that proc in a map function.
new_map(array, &mapping)
# => [2,3,4]

关于ruby - 在 Ruby 中将 "Yield"与多个方法一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28653737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com