0

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

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

非常适合阅读。

4

2 回答 2

1

合并@mikej 的答案,并替换numberself

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?
于 2013-07-11T10:09:32.653 回答
1

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

此外,Fixnums 上的 size 方法不返回数字中的位数。

最后一点:? 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
于 2013-07-11T09:43:18.467 回答