ব্যাপ্তি তৈরির ক্ষেত্রে '..' (ডাবল-ডট) এবং '...' (ট্রিপল-ডট) এর মধ্যে পার্থক্য?


111

আমি সবেমাত্র কারাগারে রুবি এবং রুবি শিখতে শুরু করেছি এবং বৈধতা কোডটি পেয়েছি যা ব্যাপ্তিগুলি ব্যবহার করে:

validates_inclusion_of :age, :in => 21..99
validates_exclusion_of :age, :in => 0...21, :message => "Sorry, you must be over 21"

প্রথম আমি চিন্তা পার্থক্য এন্ড পয়েন্ট অন্তর্ভুক্তি মধ্যে ছিল, কিন্তু এপিআই ডক্স আমি মধ্যে লাগছিল, এটা কোন ব্যাপার কিনা এটি ছিল মনে হয়নি ..বা ...: এটা সবসময় এন্ড পয়েন্ট অন্তর্ভুক্ত করা হয়েছে।

যাইহোক, আমি আইআরবিতে কিছু পরীক্ষা করেছি এবং এটি ..উভয় প্রান্তকেই অন্তর্ভুক্ত করার ইঙ্গিত দেয় বলে মনে হয়েছে , যখন ...কেবল নীচের অংশটি অন্তর্ভুক্ত করা হয়েছে তবে উপরেরটি নয়। এটা কি সঠিক?

উত্তর:


157

পরিসরের ডকুমেন্টেশন এই বলে:

..শুরু থেকে শেষ পর্যন্ত অন্তর্ভুক্তভাবে রান ব্যবহার করে নির্মিত রেঞ্জগুলি । এগুলি তৈরির মাধ্যমে ...শেষের মানটি বাদ দেয়।

তাই a..bভালো হয় a <= x <= bযেহেতু, a...bভালো হয় a <= x < b


মনে রাখবেন যে, to_aপূর্ণসংখ্যার একটি ব্যাপ্তিতে যখন পূর্ণসংখ্যার সংকলন দেওয়া হয়, তখন একটি ব্যাপ্তি মানগুলির সেট নয় , কেবল শুরু / শেষের মানগুলির একটি জুড়ি:

(1..5).include?(5)           #=> true
(1...5).include?(5)          #=> false

(1..4).include?(4.1)         #=> false
(1...5).include?(4.1)        #=> true
(1..4).to_a == (1...5).to_a  #=> true
(1..4) == (1...5)            #=> false


দস্তাবেজগুলিতে এটি অন্তর্ভুক্ত করা হত না, পরিবর্তে রেঞ্জের পিক্যাক্সের বিভাগটি পড়া দরকার । এই আপডেটটি লক্ষ করার জন্য @ মার্কাআমেরিকে ( নীচে দেখুন ) ধন্যবাদ।


11
উপরের চেয়ে আরও ভাল / কম বিভ্রান্তির উদাহরণ: (1..10).include? 10 #=> trueএবং(1...10).include? 10 #=> false
টিমম্যাক্লিউ

@ স্টিমক্লিয়ু যদিও (a..b) != (a...(b+1))তাদের অ্যারে উপস্থাপনা সমান হওয়ার পরেও (যখন ক, বি ∈ ℤ) বিষয়টি উল্লেখ করার সাথে প্রাসঙ্গিক নয় । আমি এর উত্তরটি প্রসারিত করতে আমার উত্তরটি কিছুটা আপডেট করেছি।
অ্যান্ড্রু মার্শাল

যদি রেঞ্জটি মানগুলির সেট না হয়, তবে এই কোডের টুকরোটি কেন রেঞ্জকে মানগুলির সেট হিসাবে গণ্য করে: (1..5)। যোগফল + এন}
ভ্যাভা

2
@ ভ্যালেন্টিনভ্যাসিলেভ রেঞ্জ মানগুলির একটি সেট নয়, তবে এটি সেগুলি তৈরি করতে পারে। অন্তর্ভুক্ত যা injectথেকে আসে ; ব্যবহার করে , যা প্রয়োগ করে । দ্বারা উত্পাদিত তালিকাটি কখনও কখনও বস্তুর মধ্যে থাকে না । EnumerableRangeEnumerable#eachRangeRange#eachRange
অ্যান্ড্রু মার্শাল

6

ঐটা ঠিক.

1.9.3p0 :005 > (1...10).to_a
 => [1, 2, 3, 4, 5, 6, 7, 8, 9]
1.9.3p0 :006 > (1..10).to_a
 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

ট্রিপল-ডট সিনট্যাক্স কম সাধারণ, তবে এর চেয়ে ভাল (1..10-1).to_a


12
আমি মনে করি এটি সত্যই উদ্ভট যে আরও বিন্দু মানে পরিসীমা কম মানকে উপস্থাপন করে । আমি অনুমান করি যে এটি কেবলমাত্র ..বেশি সাধারণ এবং এর জন্য এর চেয়ে কম পছন্দ করা হয়?
অ্যান্ড্রু মার্শাল

2
@ অ্যান্ড্রু: আমি এটিও ভেবেছিলাম, তবে সম্ভবত এটি দ্বি-বিন্দুতে আরও বেশি পছন্দ করা এবং টাইপ করার জন্য আরও সংক্ষিপ্ত?
Safecopy

1
এছাড়াও, নোট করুন (a..b-1) != (a...b), যদিও এই উত্তরটি বোঝায় তারা।
অ্যান্ড্রু মার্শাল

1
(a..b-1) == (a ... b) কেবল সেই ক্ষেত্রে যেখানে a এবং b পূর্ণসংখ্যা হয় এবং আপনি রেঞ্জগুলিকে অ্যারেতে গণনা করেন। পরিসীমা বিবেচনা করুন (1.0 ... 3.5) - 3.5 এর ঠিক আগে মানটি কী? অবশ্যই 2.5 নয়!
ক্রিস হিল্ড

3

এপিআই ডক্স এখন এই আচরণটি বর্ণনা করে:

..শুরু থেকে শেষ পর্যন্ত অন্তর্ভুক্তভাবে রান ব্যবহার করে নির্মিত রেঞ্জগুলি । এগুলি তৈরির মাধ্যমে ...শেষের মানটি বাদ দেয়।

- http://ruby-doc.org/core-2.1.3/Range.html

অন্য কথায়:

2.1.3 :001 > ('a'...'d').to_a
 => ["a", "b", "c"] 
2.1.3 :002 > ('a'..'d').to_a
 => ["a", "b", "c", "d"] 

1

a...b শেষের মানটি বাদ দেয় , যেখানে শেষের মানটি a..b অন্তর্ভুক্ত থাকে

পূর্ণসংখ্যার সাথে কাজ করার সময়, a...bহিসাবে আচরণ করে a..b-1

>> (-1...3).to_a
=> [-1, 0, 1, 2]

>> (-1..2).to_a
=> [-1, 0, 1, 2]

>> (-1..2).to_a == (-1...3).to_a
=> true

কিন্তু সত্যিকারের রেঞ্জগুলি একটি বাস্তব সংখ্যা লাইনে পৃথক হয় ।

>> (-1..2) == (-1...3)
=> false

ভগ্নাংশ পদক্ষেপে বৃদ্ধি করার সময় আপনি এটি দেখতে পাবেন see

>> (-1..2).step(0.5).to_a
=> [-1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0]

>> (-1...3).step(0.5).to_a
=> [-1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0, 2.5]

1
সম্পাদনার পরেও ভুল। এমনকি যদি a& bপূর্ণসংখ্যা, রেঞ্জ ভিন্ন। কেবলমাত্র প্রতিটি যখন অ্যারেতে রূপান্তরিত হয় তখন সেগুলি একই হয়। স্বীকৃত উত্তরে একটি নির্দিষ্ট কাউন্টারিক্স নমুনা বিদ্যমান।
অ্যান্ড্রু মার্শাল

2
@ অ্যান্ড্রুমারশাল এই উদাহরণটি দিয়ে আমি যা বলতে চাইছিলাম (তবে খুব ভালভাবে বোঝা যায় না) এটি পূর্ণসংখ্যার স্কেলে এটি সেভাবে আচরণ করে। আপনার উত্তরে যেমন উল্লেখ করা হয়েছে তেমন সুনির্দিষ্ট ভগ্নাংশ স্কেলের ক্ষেত্রে এটি নয়। আমি গণনা রেঞ্জগুলি প্রায়শই একটি পূর্ণসংখ্যার স্কেলে ব্যবহৃত হয়, যার কারণেই আমি বিশ্বাস করি যে এই জাতীয় ব্যাখ্যা সহায়ক।
ডেনিস

-4

.. এবং ... একটি ব্যাপ্তি বোঝায়।

এটি কেবল আইআরবিতে দেখুন:

ruby-1.9.2-p290 :032 > (1...2).each do puts "p" end
p
 => 1...2 
ruby-1.9.2-p290 :033 > (1..2).each do puts "p" end
p
p

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