2

次の整数のモンキー パッチ メソッドから正しい結果が得られません。

def harm
  1 + (2..self).inject{|sum, x| sum + 1/x.to_r}
end

2.harm #=> 3

代わりに 3/2 を返す必要があります。私の間違いはどこですか?

4

3 に答える 3

4

ここには 2 つの問題があります。

  1. のような閉じた範囲を反復処理すると2..2、実際には何も起こりません。

    (0..0).inject(){|s, x| s+= 99 }
    # => 0
    

    3これが、そのままを取得する理由1 + 2です3

  2. に引数を渡さない場合inject、イテレータに最初に渡した値を開始メモとして使用します。つまり、次のようになります2

    (2..2).inject(){|s, x| s+= 99 }
    #=> 2
    

    0 を入れると、実際の反復が得られます。

    (2..2).inject(0){|s, x| s+= 99 }
    #=> 99
    

だからあなたの方法で代わりにこれを試してください:

1 + (2..self).inject(0){|sum, x| sum + 1/x.to_r}  

スタンドアロン:

1 + (2..2).inject(0){|sum, x| sum + 1/x.to_r}  
#=> 3/2
于 2013-10-13T14:04:42.383 に答える
2

ヒントは次のとおりです(メソッドに初期値を渡す必要がありますinject):

def harm
  1 + (2..2).inject(0){|sum, x| sum + 1/x.to_r}
end

harm # => (3/2)

のドキュメントEnumerable#inject:

ブロックを指定すると、enum の各要素に対して、ブロックにアキュムレータ値 (メモ) と要素が渡されます。代わりにシンボルを指定すると、コレクション内の各要素が memo の名前付きメソッドに渡されます。どちらの場合も、結果が memo の新しい値になります。反復の最後に、 memo の最終値がメソッドの戻り値になります。

memo の初期値を明示的に指定しない場合、コレクションの最初の要素が memo の初期値として使用されます。

于 2013-10-13T14:00:21.443 に答える