Menentukan apakah suatu variabel berada dalam jangkauan?


136

Saya perlu menulis loop yang melakukan sesuatu seperti:

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

Namun sejauh ini telah menempuh jalan yang salah dalam hal sintaksis.

Jawaban:


310
jika i.between? (1, 10)
  lakukan hal 1 
elsif i.between? (11,20)
  lakukan hal 2 
...

3
Ini juga bekerja untuk objek Datedan DateTimesementara ===tidak.
Aditya

i.between?(1..10)tidak akan berfungsi (jika ya ..) Saya kira pasti ada alasan untuk itu
nonopolaritas

antara? akan membutuhkan dua parameter yang tidak memungkinkan jangkauan.
Manish Nagdewani

6
apakah itu inklusif atau eksklusif?
andrewcockerham

2
@andrianty 3.between?(1, 3) => true
Tyler James Young

86

Gunakan ===operator (atau sinonimnya include?)

if (1..10) === i

1
Memiliki manfaat bagus juga bekerja dengan imenjadi sesuatu yang lain selain angka (seperti nil)
Christoffer Klang

4
Tidak akan tampak seperti solusi yang sangat efisien jika jangkauannya sangat besar.
rthbound

6
Untuk pembaca yang akan datang, cara alternatif if i === (1..10)tidak akan berhasil
Anwar

@rthbound, kenapa? (1..10000000000000000) bukanlah sebuah array. (1..10000000000000000) === 5000000000000000hanya melakukan tes "antara" di bawah tenda
John La Rooy

1
@Anwar Bisakah Anda menjelaskan mengapa itu tidak bekerja dengan cara lain?
Govind Rai

70

Seperti yang dikatakan @Baldu, gunakan operator === atau use case / saat yang secara internal menggunakan ===:

case i
when 1..10
  # do thing 1
when 11..20
  # do thing 2
when 21..30
  # do thing 3
etc...

dari semua jawaban, ini juga kemungkinan yang paling berkinerja jika Anda memiliki beberapa rentang.
xentek

40

jika Anda masih ingin menggunakan rentang ...

def foo(x)
 if (1..10).include?(x)
   puts "1 to 10"
 elsif (11..20).include?(x)
   puts "11 to 20"
 end
end

8

Anda biasanya bisa mendapatkan kinerja yang jauh lebih baik dengan sesuatu seperti:

if i >= 21
  # do thing 3
elsif i >= 11
  # do thing 2
elsif i >= 1
  # do thing 1



1

Jawaban yang lebih dinamis, yang dapat dibangun di 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

Jadi, dalam kasus ini, "range" sebenarnya hanya dipagari dengan nil untuk menangkap kondisi batas.


-2

Untuk String:

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

# => benar

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.