确保值在集合中,如果不是,则设置默认值

sup*_*ary 2 ruby

我正在做这样的事情来检查一个参数是否在一个集合中,并设置一个默认值,如果不是.它看起来不必要地冗长:

allowed_types = [:poem, :product, :news, :facebook, :tweet]
@type = params[:type]
@type = :poem unless allowed_types.include?(@type)
Run Code Online (Sandbox Code Playgroud)

Ruby最直接的方法是什么?

mde*_*tis 5

那这个呢:

allowed_types = [:poem, :product, :news, :facebook, :tweet]
@type = allowed_types.include?(params[:type]) ? params[:type] : :poem
Run Code Online (Sandbox Code Playgroud)

看到我们在这里,我会说恕我直言,这将是一个有用的类似的数组方法Hash#fetch; 就像是:

class Array
  # `fetch` is already taken (index fetching)
  def fetch_value(something, ifnone = nil)
    include?(something) ? something : ifnone
  end
end

[:poem, :product, :news].fetch_value(:news, :poem) #=> :news
[:poem, :product, :news].fetch_value(:salad, :poem) #=> :poem
Run Code Online (Sandbox Code Playgroud)

所以有人可以这样做:

@type = allowed_types.fetch_value(params[:type], :poem)
Run Code Online (Sandbox Code Playgroud)

  • StackOverflow实现了实时语法错误检查:它被称为@Mischa =) (2认同)