2013-07-11 45 views
0

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

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 

对于阅读很多东西。

+3

使用'self'在配方中替代'number'。 – halfelf

+0

甚至只是完全删除变量名称,虽然这有时不太可读 –

+0

我试过了,但它不起作用。我发现问题:我不得不使用Fixnum类,而不是Number。谢谢。 – user2571879

回答

1

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

纳入@ mikej的回答,加上self更换number

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 

但我会建议更改名称,使其更红宝石喜欢。取而代之的#is_an,这是不是很描述,你可以怎么样#armstrong?然后调用:

153.armstrong?