কোনও ভেরিয়েবল সীমার মধ্যে থাকলে তা নির্ধারণ করা হচ্ছে?


134

আমাকে এমন একটি লুপ লিখতে হবে যা এরকম কিছু করে:

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

তবে এ পর্যন্ত সিনট্যাক্সের ক্ষেত্রে ভুল পথে নেমে গেছে।

উত্তর:


306
যদি i.between? (1, 10)
  জিনিস 1 
elsif i.between? (11,20)
  জিনিস 2 
...

3
এই জন্য কাজ করে Dateএবং DateTimeযখন বস্তু ===না।
আদিত্য

i.between?(1..10)কাজ করবে না (যদি তা হয় তবে ..) আমি মনে করি এর কোনও কারণ অবশ্যই আছে
nonopolarity

মধ্যে? দুটি পরামিতি লাগবে এটি ব্যাপ্তির অনুমতি দেয় না।
মনিশ নাগদেওয়ানি

5
এটা কি অন্তর্ভুক্তি বা একচেটিয়া?
অ্যান্ড্রুকাকারহাম

1
নিবন্ধন করুন 3.between?(1, 3) => true
টাইলার জেমস ইয়ং

84

ব্যবহার করুন ===অপারেটর (বা তার সমার্থক include?)

if (1..10) === i

1
iসংখ্যার (যেমন nil)
বাদে

4
পরিসীমা উল্লেখযোগ্য পরিমাণে বড় হয়ে থাকলে খুব কার্যকর সমাধানের মতো মনে হবে না।
rthbound

6
ভবিষ্যতের পাঠকের জন্য, বিকল্প উপায় if i === (1..10)কাজ করবে না
আনোয়ার

@ রথবাউন্ড, কেন? (1..10000000000000000) কোন অ্যারে নয় (1..10000000000000000) === 5000000000000000হুডের নীচে কেবল "মধ্যবর্তী" পরীক্ষা করছে
জন লা রুই

1
@ আনোয়ার আপনি ব্যাখ্যা করতে পারেন কেন এটি অন্যভাবে কাজ করে না?
গোবিন্দ রায়

70

@ বালডু যেমন বলেছিলেন, === অপারেটরটি ব্যবহার করুন বা কেস ব্যবহার করুন / যখন অভ্যন্তরীণভাবে ব্যবহার করে ===:

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

সমস্ত উত্তরগুলির মধ্যে, যখন আপনার একাধিক ব্যাপ্তি থাকে তখন এটি সম্ভবত সবচেয়ে পারফরম্যান্স।
xentek

40

আপনি যদি এখনও রেঞ্জ ব্যবহার করতে চান ...

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

8

আপনি সাধারণত এমন কিছু দিয়ে আরও অনেক ভাল পারফরম্যান্স পেতে পারেন:

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



1

আরও গতিশীল উত্তর, যা রুবিতে তৈরি করা যেতে পারে:

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

সুতরাং, সেক্ষেত্রে সীমাবদ্ধতা শর্তটি ধরতে "রেঞ্জগুলি" সত্যিই কেবল নীল দিয়ে বেঁধে রাখা হয়েছে।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.