我编写了一个简单的方法来检查数字是否为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
阅读很多。
答案 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?