使用自定义方法实现&:方法

时间:2015-08-18 10:14:05

标签: ruby

我已经阅读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调用作为参数传递给它的方法?

2 个答案:

答案 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
相关问题