1

我是红宝石的新手。我为一个问题编写了以下代码。我相信这段代码是正确的。

class Array 
  def sum
    result = 0
    self.each do |x|
      result += x
    end
    result
  end
end

我想知道的是如何在不使用.self方法内部的sum方法的情况下编写确切的代码。这就是我想要做的......我知道下面的代码是不正确的,但它会告诉你我想要做什么。

class Array
  def initialize
    @array = []
  end

  def sum (@array)
    result = 0
    @array.each do |x|
      result += x
    end
    result
  end
end

所以我想做的是通过在sum方法中传递一个参数而不是使用该.self方法来让这个代码工作。有什么帮助吗?谢谢!

4

4 回答 4

1

下面怎么样?

class Array
  def sum
    inject(0,:+)
  end
end
[2,9].sum # => 11

没有自我:(不是一个好的代码,而是使用上面的一个)

class Array
  def sum
    result = 0
    each do |x|
        result += x
    end
    result
  end
end
[1,1].sum # => 2
于 2013-08-16T21:02:03.367 回答
1

在 Ruby 中,如果不使用 self,则隐含 self。我将以您的代码为例。

在您的代码中,您键入self.each. 如果你只是写each它也可以。您的代码片段如下所示:

def sum
  result = 0
  each do |x|
    result += x
  end
  result
end

这将以完全相同的方式工作。

[1,2,3,4].sum
#=> 10

为什么?在这种情况下[1,2,3,4]is self,并且因为each,一个方法,没有被任何东西调用, thenself是隐含的,并且您的代码被解释为好像您说过self.each。请注意,在这种情况下,与许多情况一样,您需要键入self.each,因为它对读者来说更有意义。因此,你在上面写它的方式是最好的。

如果我是你,我现在会探索inject。您可以通过调用注入方法来执行您的方法的操作:

[1,2,3,4].inject { |accum, elem| accum + elem }
#=> 10

更妙的是,

[1,2,3,4].inject(:+)
#=> 10

我将留给您探索 Ruby 的深度,这个非常有趣的方法,以及它是如何inject(:+)工作的。注意:在网上看的时候,:inject:reduce都是一样的。就像:count:length对于一个数组一样。我把 : 它们放在前面作为关于 inject(:+).

于 2013-08-16T21:32:24.700 回答
1

所以我想要做的是通过在 sum 方法中传递一个参数而不是使用 .self 方法来让这个代码工作。有什么帮助吗?

我相信你真的很困惑。至少有两种方法(我希望您关注):

  • 实例方法
  • 自由方法(Kernel类中定义的方法)

在您的情况下,您真正​​想要的是一个免费方法(与Array 类无关),可以这样定义:

def sum(array)
    array.reduce(:+)
end

并使用如下:

sum([1, 2, 3])
# => 6

我向您建议的是坚持使用实例方法版本:

class Array
    def sum
        reduce(:+)
    end
end

并像这样使用它:

[1, 2, 3].sum
# => 6
于 2013-08-16T23:56:43.370 回答
0

我不得不争辩说你实际上想使用 self 而不是排除它。据我所知,在实例方法中使用 self 是首选做法。至于你的 sum 方法,我可能会这样写:

class Array
  def sum
    total = 0.0
    self.each {|x| total += x if ["Fixnum", "Float"].include?(x.class.name)}
    total%1==0 ? total.to_i : total
  end
end

a = [1, 2, 3, "y"]
b = [2, "z", 4.3]

puts a.sum #=> 6
puts b.sum #=> 6.3
于 2013-08-16T21:40:30.650 回答