142

次のようなループを作成する必要があります。

if i (1..10)
  do thing 1
elsif i (11..20)
  do thing 2
elsif i (21..30)
  do thing 3
etc...

しかし、これまでのところ、構文に関して間違った道を進んでいます。

4

10 に答える 10

319
if i. between?(1, 10)
  ことをする 1
elsif i. between?(11,20)
  ことをする 2
...
于 2010-08-17T19:01:21.377 に答える
91

===演算子 (またはその同義語include?)を使用する

if (1..10) === i
于 2009-05-15T19:52:18.977 に答える
71

@Baldu が言ったように、 === 演算子または use case/when を内部的に使用する === を使用します。

case i
when 1..10
  # do thing 1
when 11..20
  # do thing 2
when 21..30
  # do thing 3
etc...
于 2009-05-15T19:55:16.287 に答える
42

それでも範囲を使用したい場合...

def foo(x)
 if (1..10).include?(x)
   puts "1 to 10"
 elsif (11..20).include?(x)
   puts "11 to 20"
 end
end
于 2009-05-15T19:54:45.477 に答える
9

通常、次のようなものを使用すると、パフォーマンスが大幅に向上します。

if i >= 21
  # do thing 3
elsif i >= 11
  # do thing 2
elsif i >= 1
  # do thing 1
于 2014-05-28T21:15:03.803 に答える
6

質問への直接の答えではありませんが、「内」の反対が必要な場合:

(2..5).exclude?(7)

真実

于 2016-11-09T14:05:55.313 に答える
2

最速の方法が必要な場合は、古き良き比較を使用してください。

require 'benchmark'

i = 5
puts Benchmark.measure { 10000000.times {(1..10).include?(i)} }
puts Benchmark.measure { 10000000.times {i.between?(1, 10)}   }
puts Benchmark.measure { 10000000.times {1 <= i && i <= 10}   }

私のシステムでは次のように印刷されます:

0.959171   0.000728   0.959899 (  0.960447)
0.919812   0.001003   0.920815 (  0.921089)
0.340307   0.000000   0.340307 (  0.340358)

ご覧のとおり、二重比較はorメソッドよりもほぼ 3 倍高速です。#include?#between?

于 2021-05-19T00:43:02.830 に答える
1

Rubyで構築できるより動的な答え:

def select_f_from(collection, point) 
  collection.each do |cutoff, f|
    if point <= cutoff
      return f
    end
  end
  return nil
end

def foo(x)
  collection = [ [ 0, nil ],
                 [ 10, lambda { puts "doing thing 1"} ],
                 [ 20, lambda { puts "doing thing 2"} ],
                 [ 30, lambda { puts "doing thing 3"} ],
                 [ 40, nil ] ]

  f = select_f_from(collection, x)
  f.call if f
end

したがって、この場合、「範囲」は実際には、境界条件をキャッチするために nil で囲まれています。

于 2009-05-16T04:58:29.960 に答える
-2

文字列の場合:

(["GRACE", "WEEKLY", "DAILY5"]).include?("GRACE")

#=> true

于 2012-12-14T11:39:28.317 に答える