1

次のコードは正常に機能します。

class Float
  def round
   self.format.to_f
  end

  def format
    "%.2f" % self
  end
end

ただし、他の人が同じことをしていて問題が発生するため、Floatのようなクラスにモンキーパッチを適用するのは悪い習慣のようです。

次に、simplecovをインストールすると、問題が発生しました。simplecovは同じメソッドをモンキーパッチします。

そこで、モジュールを作成してFloatにミックスしました。

module MyModule
  def round
   self.format.to_f
  end

  def format
    "%.2f" % self
  end
end

これもうまくいくと思います。しかし、問題は、simplecovが上記の混合メソッドを上書きしているように見えることです。

では、他の人のコードと競合しないように組み込みクラスを拡張する適切な方法は何ですか?

Ruby 1.9.3

4

1 に答える 1

1

round呼び出しで引数だけを使用してみませんか?

13.6657.round(2)    # => 13.67

ただし、モジュールが必要であることが確実な場合(すべてのフロートの形式を調整するために、formatメソッドをそのように定義することをお勧めします。

module MyModule
  def format
    ("%.2f" % self).to_f
  end
end

そしてこれをフロートに混ぜます。そして、コードの後半でformat、roundの代わりにメソッドを呼び出します。

13.6657.format     # => 13.67

このようにして、コア機能を損なうことはありません(最初のコードがround定義から引数を削除したため)。

さらに良い-モンキーパッチを正確に特定したい(できる)場合は、特定のインスタンスを拡張するだけです。

a = 13.6657
a.extend MyModule

a.format           # => 13.67

このようにして、他のFloatと混同することはありませんがa.round(2)、コード内のすべての呼び出しを見つけることなく、フォーマットを調整することができます。

于 2012-10-12T07:38:21.290 に答える