0

数値がアームストロング数かどうかをチェックする簡単なメソッドを書きました。しかし今、デフォルトの 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

元の質問に対する回答ではありませんが、コードに小さなバグがいくつかあります。inject初期値として使用するには、 に 0 を渡す必要があります。それ以外の場合injectは、リストの最初の値を初期値として取得します。1^3 == 1 であるため、現在のコードは 153 で機能しているように見えますが、たとえば、true を返すべきときに 370 では false を返します。

また、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 に答える
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?
于 2013-07-11T10:09:32.653 に答える