我可以在编写将传递此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
答案 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
将定义一个类方法 - 在其中,self
是Array
(即Class
的实例) - 并且因为那些没有{{1}方法,你做不到。您只需要map
来定义它:
def square
使用def square
map { |x| x * x } # (or self.map)
end
,您无法替换square!
,但可以替换其中的每个元素。
self