Rspec Array_extensions类或实例方法

时间:2014-05-19 01:21:35

标签: ruby arrays class rspec instance

我可以在编写将传递此spec文件的程序时使用一些帮助。

据我了解,类方法用'。'表示,而实例方法用'#'表示。这里,方法用'#'表示,我假设'[]'可以按字面翻译为'Array.new'。在这种情况下,我如何编写一个实例方法,如'sum' - 它贯穿数组并计算总和 - 它不是在实例变量上操作而是在对象本身上操作?换句话说,不是像

这样的属性
def sum
    @sum.each do …

但是类似

def sum
    self.each do …

我考虑过制作这些类方法,但是当我尝试在'square!'方法中重新分配数组本身的值时,这给了我'自我'无法改变的错误。

我的问题是,我如何解决这个难题,这些类方法或实例方法是什么?

谢谢。

这是spec文件:

require "array_extensions" # we don't call it "array.rb" since that would be confusing

describe Array do

  describe "#sum" do
    it "has a #sum method" do
      [].should respond_to(:sum)
    end

    it "should be 0 for an empty array" do
      [].sum.should == 0
    end

    it "should add all of the elements" do
      [1,2,4].sum.should == 7
    end
  end

  describe '#square' do
    it "does nothing to an empty array" do
      [].square.should == []
    end

    it "returns a new array containing the squares of each element" do
      [1,2,3].square.should == [1,4,9]
    end
  end

  describe '#square!' do
    it "squares each element of the original array" do
      array = [1,2,3]
      array.square!
      array.should == [1,4,9]
    end
  end

end

这是我的代码:

class Array
  attr_accessor :sum

  def sum
    total = 0
    []s.each { |x| total += x }
    @sum = total
  end
  def self.square
    if self.empty?
      self
    else
      newArray = self.map { |x| x*x }
  end
  def self.square!
    self = self.map { |x| x*x }
  end
end

2 个答案:

答案 0 :(得分:2)

这是满足您的rspec要求的一种非常简洁的方法:

class Array
  def sum
    inject(0, &:+)
  end
  def square
    map { |x| x * x }
  end
  def square!
    map! { |x| x * x }
  end
end

答案 1 :(得分:1)

self.each或仅each是正确的:

def sum
  total = 0
  self.each { |x| total += x }
  # or
  # each { |x| total += x }
  total
end
在课堂上

应该有效。但是有一种更简单的方法,

def sum
  inject { |a, x| a + x }   # (or self.inject)
end

def self.square将定义一个类方法 - 在其中,selfArray(即Class的实例) - 并且因为那些没有{{1}方法,你做不到。您只需要map来定义它:

def square

使用def square map { |x| x * x } # (or self.map) end ,您无法替换square!,但可以替换其中的每个元素。

self