Ruby - 修改类

时间:2013-07-11 09:14:36

标签: ruby algorithm class methods

我编写了一个简单的方法来检查数字是否为Armstrong number。 但是现在我想修改默认的Number类put方法。 所以,我有代码:

def is_an(number)
    (number.to_s.split(//).map(&:to_i).inject{|x,y|x+y**(number.size-1)}) == number ? true : false
end
p is_an(153)

我想将其用作方法:153.is_a? 那么,我是怎么做到的?

class Number
   def is_an
      ??? How to use object data over here? ???
   end
end

阅读很多。

2 个答案:

答案 0 :(得分:1)

不是原始问题的答案,但代码中有一些小错误。您需要将0传递给inject以用作初始值。否则,inject将列表中的第一个值作为初始值。你当前的代码似乎适用于153,因为1 ^ 3 == 1但是它会返回370,例如,它应该返回true。

此外,size method on Fixnums不会返回数字中的位数。

最后,一个小问题:不需要? true : false,因为... == number表达式的值已经是必需的布尔值。所以可能的更新方法是:

def is_an(number)
    digits = number.to_s.split(//).map(&:to_i)
    digits.inject(0) { |x,y| x+y**digits.size } == number
end

答案 1 :(得分:1)

合并@ mikej的答案,并将number替换为self

class Fixnum
  def is_an
    digits = self.to_s.split(//).map(&:to_i)
    digits.inject(0) { |x,y| x+y**digits.size } == self
  end
end

但我会建议更改名称,以使其更像Ruby。而不是#is_an,而不是非常具有描述性的#armstrong?,那么您可以致电:

153.armstrong?