5

これは、Rubyでデフォルトを設定する一般的な方法です。

class QuietByDefault
  def initialize(opts = {})
    @verbose = opts[:verbose]
  end
end

これは簡単に陥る罠です:

class VerboseNoMatterWhat
  def initialize(opts = {})
    @verbose = opts[:verbose] || true
  end
end

これはそれを行う正しい方法です:

class VerboseByDefault
  def initialize(opts = {})
    @verbose = opts.include?(:verbose) ? opts[:verbose] : true
  end
end

コーディングするための最良/最もクリーンな方法は何VerboseByDefaultですか?(もちろん、それを除外することはできます。)

一般に、Rubyコードで広く使用されているパターンは何ですか?ActiveSupportにはこのためのパターンがありますか?(最小限の方が優れています。完全なコマンドラインオプションパーサーは必要ありません。)

trueRanting PS:デフォルトを処理するコードとデフォルトfalseオプションを処理するコードの非対称性は好きではありません。バグを発生させることなく、2つの間で変化するパターンを見るのは良いことです。

4

3 に答える 3

7

これを行う簡単な方法は、Hash#fetch の 2 番目の引数を使用することです。

class VerboseByDefault
  def initialize(opts = {})
    @verbose = opts.fetch(:verbose, true)
  end
end

複雑なデフォルトの場合、fetch はブロックを取ることもできます。これは、値がハッシュにない場合に実行されます。参照: http://ruby-doc.org/core-1.9.3/Hash.html#method-i-fetch

于 2012-08-14T02:00:03.413 に答える
1

私は一般的に、すべてのデフォルトを設定してから、それらをオプションとマージするように見てきました。そのような..

def initialize(opts = {})
  @options = { :verbose => false, :foo => 42 } 
  @options.merge!(opts)
  # ...
end

このようにして、すべてのオプションを 1 か所で設定し、ユーザーが指定したオプションをマージするだけです。

于 2012-08-13T17:47:05.767 に答える
0
require 'active_support/core_ext/hash/reverse_merge'
class VerboseByDefault
  DEFAULTS = { verbose: true }
  def initialize(opts = {})
    opts.reverse_merge!(DEFAULTS)
    @verbose = opts[:verbose]
  end
end

これは、オプションが 1 つあるだけで少しすっきりするだけでなく、オプションが増えるとさらに良くなります。また、 と に同じパターンを使用しtrueますfalse

于 2012-08-14T01:16:54.357 に答える