簡體   English   中英

默認情況下將選項設為 false

[英]Making an option false by default

這是在 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 有這方面的模式嗎? (最小更好——我不需要完整的命令行選項解析器。)

咆哮 PS:我不喜歡處理默認true的代碼與處理默認false選項的代碼之間的不對稱。 可以在兩者之間進行更改的模式(不會引起錯誤)將是一件好事。

一個簡單的方法是使用 Hash#fetch 的第二個參數

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

我通常將其視為設置所有默認值,然后將它們與 opts 合並。 如..

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

這樣,您的所有選項都設置在一個地方,您只需合並用戶提供的選項。

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

這不僅對於一個選項來說更簡潔,而且如果您有更多選項,它會變得更好。 此外,它對truefalse使用相同的模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM