![](/img/trans.png)
[英]Is there a possibility that null is inserted when add_column with default option, and without null: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
這不僅對於一個選項來說更簡潔,而且如果您有更多選項,它會變得更好。 此外,它對true
和false
使用相同的模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.