我已经阅读this question,但我在那里实施这些概念时遇到了麻烦。
我从提供测试的exercism.io做了一个练习。练习的目的是实现一个accumulate方法,返回传递给它的数字的平方。我们需要在不使用map / inject的情况下完成此操作。
这没问题,但其中一项测试如下:
def test_accumulate_upcases
result = %w(hello world).accumulate(&:upcase)
assert_equal %w(HELLO WORLD), result
end
我有以下课程
class Array
def accumulate
squares = []
self.each { |x| squares << x**2 unless x.is_a? String }
squares
end
def upcase
upcase = []
self.each { |word| word.upcase }
upcase
end
end
但我并不完全理解正在测试的概念。如何让accumulate
调用作为参数传递给它的方法?
答案 0 :(得分:2)
似乎您应该使用新方法Array
扩展accumulate
类,这将累积在数组的每个元素上调用给定proc
的结果。
一种实现可以是这样的:
class Array
def accumulate(&block)
self.collect { |i| block.yield(i) }
end
end
p result = %w(hello world).accumulate(&:upcase) # Prints ["HELLO", "WORLD"]
p result = %w(hello world).accumulate { |b| b.upcase } # Prints ["HELLO", "WORLD"]
请注意%w(HELLO WORLD)
与数组["HELLO", "WORLD"]
对this article中&
运算符的用法有一个非常好的解释 - 请阅读 The Unary&amp;
答案 1 :(得分:0)
accumulate
方法希望将方法名称称为Symbol
。
def accumulate meth = nil
result = []
case
when meth.nil?
self.each { |e| result << e.public_send meth }
when block_given?
self.each { |e| result << yield e }
else
fail 'This method expects either block or method name'
end
end