【问题标题】:Is there a cleaner way to write this kind of Ruby conditional?有没有一种更简洁的方法来编写这种 Ruby 条件?
【发布时间】:2012-01-12 22:01:20
【问题描述】:

我正在尝试找出是否有更简洁的方法来编写这样的内容:

if var1 == "hi" || var1 == "bye" || var1 == "well" || var1 == "hello"
  puts var1
end

基本上,只有一个变量,我想知道它是否等于几个可能值之一。

我尝试了以下但无效:

if var1 == ("hi" || "bye" || "well" || "hello")
  puts var1
end

【问题讨论】:

    标签: ruby


    【解决方案1】:
    puts var1 if %w(hi bye well hello).include? var1
    

    【讨论】:

    • 哇,太棒了!谢谢你。对于将来发现此问题的任何人,%w 很难输入到搜索引擎中,因此这里是有关如何使用它们的相关问题的链接:stackoverflow.com/questions/4287503/…
    • 实际上 %w 不是解决方案的关键部分,它只是另一种制作数组的方法。 "['hi', 'bye', 'well', 'hello'].include?var1" 会做同样的事情。
    【解决方案2】:

    如果列表更大并且您要经常检查它,那么您可以使用哈希来节省一些时间:

    want = Hash[%w{hi bye well hello}.map { |s| [ s, true ] }]
    puts var1 if(want[var1])
    

    或一组:

    want = Set[*%w{hi bye well hello}] # Or want = %w{...}.to_set
    puts var1 if want.include? var1
    

    构建哈希或集合是一次性的,但检查哈希将比使用include? 扫描数组快得多。如果有很多事情要检查或者您一遍又一遍地检查,那么差异可能是值得的。

    【讨论】:

    • Set[%w{hi bye well hello}] 通过编写此代码,Set 仅获得一个值,即数组本身,因此代码无法正常工作。也许 %w{hi bye well hello}.to_set ?
    • @oldergod:我想我漏掉了一个 splat (Set[*%w{...}]) 但to_set 也可以。感谢您发现这一点。
    猜你喜欢
    • 2019-11-07
    • 1970-01-01
    • 2019-12-27
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多