রুবির অনেক আকর্ষণীয় অপারেটর রয়েছে৷
৷লাইক :
- স্পেসশিপ অপারেটর (
<=>
) - মডিউল অ্যাসাইনমেন্ট অপারেটর (
%=
) - ট্রিপল সমান (
===
) অপারেটর - এর চেয়ে বড় (
>
) এবং এর চেয়ে কম (<
) - সমান নয় (
!=
)
আপনি কি বুঝতে পারেন না যে এই অপারেটরগুলির মধ্যে অনেকগুলি আসলে রুবি পদ্ধতি .
এর মানে…
তারা যা করে তা আপনি ওভাররাইট করতে পারেন এবং আপনার নিজের ক্লাসে কাস্টম আচরণ সংজ্ঞায়িত করতে ব্যবহার করতে পারেন।
উদাহরণস্বরূপ, ==
সংজ্ঞায়িত করে আপনি রুবিকে বলতে পারেন কিভাবে একই শ্রেণীর দুটি বস্তুর তুলনা করা যায়।
এখন :
আসুন কয়েকটি উদাহরণ দেখি যাতে আপনি এই রুবি অপারেটরগুলি কীভাবে কাজ করে এবং এগুলি কীভাবে ব্যবহার করবেন তার একটি কঠিন ওভারভিউ পেতে পারেন আপনার কোডে।
আপনি যদি সত্যিই রুবিকে বুঝতে চান তবে এটি একটি গুরুত্বপূর্ণ বিষয়।
বিষয়বস্তু
- 1 রুবি লজিক্যাল অপারেটর
- 2 রুবি পাটিগণিত অপারেটর
- 3 অ্যাসাইনমেন্ট অপারেটর (==, +=, ||=)
- 4 ইউনারি অপারেটর কি?
- 5 রুবি স্প্ল্যাট অপারেটর (উদাহরণ সহ)
- 6 ম্যাচিং অপারেটর (=~)
- 7 রুবি টারনারি অপারেটর (প্রশ্ন চিহ্ন অপারেটর)
- 8 বেলচা / পুশ অপারেটর (<<)
- 9 ট্রিপল ইকুয়ালস অপারেটর (সমতার চেয়ে বেশি)
- 10 নিরাপদ ন্যাভিগেটর অপারেটর (&)
- 11 অপারেটর অগ্রাধিকার সারণী
- 12 সারাংশ
- 12.1 সম্পর্কিত
রুবি লজিক্যাল অপারেটর
প্রথমত, আমরা লজিক্যাল অপারেটর দেখতে যাচ্ছি।
আপনি দুটি বস্তুর তুলনা করতে সাহায্য করতে এই অপারেটরগুলি ব্যবহার করতে পারেন৷ এবং ফলাফলের উপর ভিত্তি করে একটি সিদ্ধান্ত নিন।
এখানে একটি টেবিল আছে:
অপারেটর | বর্ণনা |
---|---|
< | এর চেয়ে কম |
> | এর চেয়ে বড় |
>= | এর চেয়ে বড় বা সমান |
<= | এর চেয়ে কম বা সমান |
== | সমান |
!= | সমান নয় |
<=> | বড়, সমান, বা কম |
এই সমস্ত অপারেটর হল পদ্ধতি, এবং তারা একটি বুলিয়ান মান ফেরত দেয় , স্পেসশিপ অপারেটর বাদ দিয়ে। স্পেসশিপ অপারেটর 1 (এর চেয়ে বড়), 0 (সমান) বা -1 (এর চেয়ে কম) ফেরত দেয়।
এখানে >
ব্যবহার করার একটি উদাহরণ অপারেটর:
if orange.stock> 20 # ...end
আপনি যদি দ্বিগুণ সমান ব্যবহার করতে চান (==
) আপনার নিজের ক্লাসের অপারেটর আপনি দেখতে পারেন যে এটি প্রথমে কাজ করে না…
উদাহরণ :
ক্লাস ফ্রুট ডিফ ইনিশিয়ালাইজ(নাম) @name =name endendorange1 =Fruit.new("orange")orange2 =Fruit.new("orange")orange1 ==orange2# false
এর কারণ হল ==
এর ডিফল্ট বাস্তবায়ন হল BasicObject#==, যা object_id
ব্যবহার করে দুটি বস্তু একই কিনা তা খুঁজে বের করার পদ্ধতি।
আপনি এটি এভাবে ঠিক করতে পারেন:
শ্রেণীর ফল attr_reader :name def initialize(name) @name =name end def ==(other) name ==other.name endend
এখানে আমরা বলছি দুটি ফল একই হওয়ার অর্থ কী:
তাদের অবশ্যই একই নাম থাকতে হবে।
রুবি পাটিগণিত অপারেটর
অপারেটরদের পরবর্তী সেট হল পাটিগণিত অপারেটর।
এখানে নতুন কিছু নেই...
5 + 5# 1010 * 2# 2010 ** 2# 100
কিন্তু ঠিক ==
এর মত অপারেটর, এগুলো হল পদ্ধতি।
এটি দরকারী কারণ দুটি বস্তু একসাথে যোগ করার অর্থ কী তা আপনি নির্ধারণ করতে পারেন .
তাই যদি আপনার দুটি Order
থাকে বস্তু, সেগুলিকে একত্রে যোগ করলে আপনাকে মোট অর্থ প্রদান করতে হবে, অথবা আপনি একটি নতুন অর্ডার পাবেন যা এই দুটি অর্ডারের সংমিশ্রণ।
আপনি ঠিক সংজ্ঞায়িত করতে পারেন কিভাবে আপনি +
সংজ্ঞায়িত করে এটি কাজ করতে চান পদ্ধতি।
আরেকটি অপারেটর যার সাথে আপনি পরিচিত নাও হতে পারেন তা হল মডুলো অপারেটর .
এটি শতাংশ চিহ্নের মত দেখাচ্ছে (%
)।
এবং এটি আপনাকে একটি বিভাগের অবশিষ্ট অংশ দেয় .
উদাহরণ :
10 % 2# 0
মডুলো অপারেটরের অনেক ব্যবহারিক ব্যবহার আছে , যেমন একটি সংখ্যা জোড় বা বিজোড় কিনা, একটি সংখ্যা অন্য দ্বারা বিভাজ্য কিনা, একটি সংখ্যার সীমা নির্ধারণের জন্য ইত্যাদি।
অ্যাসাইনমেন্ট অপারেটর (==, +=, ||=)
এর পরেরটি হল অ্যাসাইনমেন্ট অপারেটর, এবং এখন পর্যন্ত আমরা যে সমস্ত অপারেটর দেখেছি তার বিপরীতে, এগুলো কোনো পদ্ধতি নয়।
আপনার কাছে মৌলিক অ্যাসাইনমেন্ট অপারেটর আছে:
a =1
কিন্তু আপনার সম্মিলিত অ্যাসাইনমেন্ট অপারেটরও আছে:
a +=5# 6a *=2# 12
এগুলি বর্তমান মান পড়ার সমতুল্য এবং এটির সাথে একটি গাণিতিক অপারেটর ব্যবহার করে ফলাফলটি সংরক্ষণ করে। আপনি মডুলো অপারেটর (%
) সহ সমস্ত গাণিতিক অপারেটরের সাথে এটি করতে পারেন )।
কিন্তু দুটি অ্যাসাইনমেন্ট অপারেটর আছে যারা ভিন্নভাবে আচরণ করে!
এগুলো হল ||=
এবং &&=
.
তারা আলাদা কারণ তারা সমতুল্য নয় পাটিগণিত সংস্করণে।
কি a ||= 100
এটা করে:
“যদি
a
বিদ্যমান নেই বা যদি এটিfalse
হয় অথবাnil
তারপর100
বরাদ্দ করুন এটিতে, অন্যথায় শুধুমাত্রa
এর মান ফেরত দিন ”
আমি একটি সমতুল্য অভিব্যক্তির নিকটতম যা পেতে পারি তা হল:
(সংজ্ঞায়িত?(a) &&a)? a :a =100
আপনি যদি কিছু ধীরগতির গণনা বা API অনুরোধের ফলাফল সংরক্ষণ করতে চান তবে এটি দরকারী, একটি প্রক্রিয়া যা "মেমোাইজেশন" নামে পরিচিত৷
ইউনারি অপারেটর কি?
এখন পর্যন্ত আপনি শুধুমাত্র 2টি মান নিয়ে কাজ করে এমন অপারেটর দেখেছেন, কিন্তু এমনও অপারেটর আছে যারা শুধুমাত্র একটি মান নিয়ে কাজ করে , আমরা এইগুলিকে "ইউনারি অপারেটর" বলি।
উদাহরণস্বরূপ :
+"abc"
এটি একটি হিমায়িত স্ট্রিংয়ের একটি পরিবর্তনযোগ্য অনুলিপি তৈরি করে৷
আপনি আপনার নিজস্ব অপারেটর (+
) সংজ্ঞায়িত করতে পারেন / -
), কিন্তু আপনার কিছু বিশেষ সিনট্যাক্স প্রয়োজন।
উদাহরণ :
ক্লাস স্ট্রিং ডিফ +@ হিমায়িত? ? self.dup :self endendstr ="abc". freezep (+str). হিমায়িত?# মিথ্যা
আমাকে এখানে বন্ধনী ব্যবহার করতে হবে কারণ ইউনারি অপারেটরদের অপারেটর অগ্রাধিকারের কারণে।
আপনার কাছে !!
আছে , যা একটি পদ্ধতি নয়:
!!123# true!!nil# false
এটি একটি দরকারী কারণ এটি যেকোনো মানকে বুলিয়ানে পরিণত করবে .
তারপর আপনার কাছে !
আছে , যা একই কিন্তু এটি আপনাকে বিপরীত বুলিয়ান মান দেয়।
উদাহরণ :
!true# false!!true# true!false# true
রুবি স্প্ল্যাট অপারেটর (উদাহরণ সহ)
স্প্ল্যাট অপারেটর (*
) আকর্ষণীয় কারণ এটি এমন কিছু করে যা আপনি এটি ছাড়া করতে পারবেন না।
ধরুন আপনার কাছে এরকম একটি অ্যারে আছে:
গুণাবলী =[:title, :author, :category]
এবং আপনি এই অ্যারেটি এমন একটি পদ্ধতির সাথে ব্যবহার করতে চান যা পরিবর্তনশীল আর্গুমেন্ট নেয়, যেমন attr_reader
.
তারপর আপনি এটি করতে পারেন:
attr_reader * বৈশিষ্ট্যগুলি
স্প্ল্যাট অপারেটর অ্যারেটিকে এর উপাদানগুলির একটি তালিকায় রূপান্তরিত করে। সুতরাং এটি অ্যারেটি কেড়ে নেওয়া এবং এটির ভিতরের সমস্ত কিছু দিয়ে প্রতিস্থাপন করার মতো হবে৷
৷অন্য কথায়, শেষ উদাহরণটি এতে অনুবাদ করে:
attr_reader :title, :author, :category
এটি স্প্ল্যাট অপারেটরের ক্ষমতা 🙂
ম্যাচিং অপারেটর (=~)
এই মজার চেহারার রুবি অপারেটর কি (=~
) টিল্ড সহ?
এটি ম্যাচিং অপারেটর!
এটি আপনাকে রেগুলার এক্সপ্রেশন ব্যবহার করে দ্রুত সূচক অনুসন্ধান করতে দেয়।
এখানে একটি উদাহরণ:
"3oranges" =~ /[0-9]/# 0
এটি সংখ্যার সন্ধান করে এবং প্রথম মিল পাওয়া যায় এমন স্ট্রিংয়ের ভিতরে সূচী প্রদান করে , অন্যথায় এটি শূন্য ফেরত দেয়।
এছাড়াও, আপনার কাছে !~
আছে অপারেটর, যা "নট মেলে" অপারেটর৷
উদাহরণ :
"abc" !~ /[0-9]/# মিথ্যা
আপনি true
পাবেন অথবা false
এটির সাথে, কোন সূচী নেই, তাই এটি মনে রাখবেন।
রুবি টারনারি অপারেটর (প্রশ্ন চিহ্ন অপারেটর)
আপনি যদি কমপ্যাক্ট এবং শর্ট কোড পছন্দ করেন তাহলে আপনি রুবি টারনারি অপারেটরকে পছন্দ করবেন।
এটি কম্প্যাক্ট if/else স্টেটমেন্ট লেখার একটি উপায়।
এটা এরকম দেখাচ্ছে :
<পূর্ব> শর্ত? সত্য:মিথ্যাএখানে একটি উদাহরণ আছে :
<প্রে>""। আকার ==0? "Empty string" :"অ-খালি স্ট্রিং"এটি এভাবেই কাজ করে :
একটি টার্নারি অপারেটরের প্রথম অংশ শর্তটি সংজ্ঞায়িত করে ("".size == 0
)।
তারপর আপনার কাছে একটি প্রশ্নবোধক চিহ্ন রয়েছে (?
)।
এর পরে, যখন এই শর্তটি সত্য হয় এর জন্য আপনার কাছে রিটার্ন মান রয়েছে .
তারপর একটি কোলন (:
)।
এবং শেষ অংশটি হল যখন এই শর্তটি মিথ্যা হয় এর রিটার্ন মান , এটি হবে else
একটি সম্পূর্ণ শর্তসাপেক্ষ অভিব্যক্তিতে৷
বেলচা / পুশ অপারেটর (<<)
এই অপারেটর (<<
)ও একটি পদ্ধতি, তাই আপনি কোন বস্তুর সাথে কাজ করছেন তার উপর নির্ভর করে এটি কী করে তা পরিবর্তন করে৷
উদাহরণস্বরূপ, অ্যারেগুলির সাথে এটি শুধুমাত্র push
এর একটি উপনাম পদ্ধতি।
প্রাণী =[]প্রাণী <<"বিড়াল"
স্ট্রিং সহ এটি শেষে যুক্ত হবে:
"" <<"বিড়াল"
এবং Integers
সহ , এটি একটি "বাম স্থানান্তর" করবে, যা সমস্ত বিটকে বাম দিকে ঘোরায়৷
2 <<1# 42 <<2# 82 <<3# 16
ট্রিপল ইকুয়ালস অপারেটর (সমতার চেয়ে বেশি)
আমাদের শেষ অপারেটর আজ হতে চলেছে ট্রিপল ইক্যুয়াল অপারেটর (===
)।
এটিও একটি পদ্ধতি, এবং এটি এমন জায়গায়ও প্রদর্শিত হয় যেখানে আপনি এটি আশা করেন না৷
৷উদাহরণস্বরূপ, একটি কেস বিবৃতিতে:
কেস "বেকন" যখন স্ট্রিং রাখে "এটি একটি স্ট্রিং!"যখন পূর্ণসংখ্যা রাখে "এটি একটি পূর্ণসংখ্যা"শেষ
রুবি ===
কে কল করছে পদ্ধতি এখানে ক্লাসে।
এই মত:
স্ট্রিং ==="বেকন"
এটি অন্যান্য অবজেক্টের ক্লাসের সাথে বর্তমান ক্লাসের তুলনা করে।
তাই এই অপারেটরের বিষয় হল সমতাকে সংজ্ঞায়িত করা একটি কেস স্টেটমেন্টের পরিপ্রেক্ষিতে।
নিরাপদ নেভিগেটর অপারেটর (&)
আপনি একটি বস্তুর উপর একটি পদ্ধতি কল করতে চাইতে পারেন, কিন্তু এই বস্তুটি nil
হতে পারে , যা ভাল নয় কারণ nil
-এ একটি পদ্ধতি কল করা প্রায়শই একটি ত্রুটির ফলাফল হয়৷
একটি সমাধান :
যদি ব্যবহারকারী &&user.active # ...end
এটি করার একটি ভাল উপায় :
যদি ব্যবহারকারী&.active # ...end
এই &.
নিরাপদ ন্যাভিগেটর অপারেটর (রুবি 2.3 এ চালু করা হয়েছে), যা শুধুমাত্র active
কে কল করে user
এ পদ্ধতি যদি এটি nil
না হয় .
খুব দরকারী!
অপারেটর অগ্রাধিকার সারণী
অগ্রাধিকারের তালিকা অনুসরণ করে রুবি আপনার সোর্স কোডের মূল্যায়ন করে, যেমন গুণ ও বন্ধনী দিয়ে গণিতে কী ঘটে।
যদি আপনি এটি কিভাবে কাজ করে তা বুঝতে না পারলে এটি সব ধরনের ত্রুটির উৎস হয়ে উঠতে পারে।
এখানে একটি টেবিল, উচ্চ থেকে নিম্ন অগ্রাধিকার :
অপারেটর |
---|
!, ~, unary + |
** |
ইউনারি - |
*, /, % |
+, - |
<<,>> |
& |
|, ^ |
>,>=, <, <= |
<=>, ==, ===, !=, =~, !~ |
&& |
|| |
?, : |
মোডিফায়ার-রেসকিউ |
=, +=, -=, *=, /=, %= |
সংজ্ঞায়িত? |
না |
বা, এবং |
{ } ব্লক |
করুন ... শেষ ব্লক |
modifier-something এর মানে হল এই কীওয়ার্ডগুলির এক-লাইনার সংস্করণ৷
৷উদাহরণ :
ব্লগ_নাম =="রুবিগাইডস" থাকলে "অসাধারণ" রাখে
এখানে একটি উদাহরণ যেখানে ব্লক অগ্রাধিকার আপনাকে অবাক করে দিতে পারে:
# বড় হাতের অক্ষর ["a", "b", "c"] সহ অ্যারে প্রদান করে। মানচিত্র { | অক্ষর| character.upcase }# রিটার্নস গণনাকারী অবজেক্টপি ["a", "b", "c"]. Map do | character| character.upcaseend
প্রথম ক্ষেত্রে এটি প্রত্যাশিত হিসাবে কাজ করে, দ্বিতীয় ক্ষেত্রে ব্লকের অগ্রাধিকার কম তাই map
মনে করে কোন ব্লক নেই এবং একটি গণনাকারী প্রদান করে।
সারাংশ
আপনি রুবির অনেক অপারেটর সম্পর্কে শিখেছেন, পাটিগণিত অপারেটর থেকে লজিক এবং এমনকি আরও অস্পষ্ট ইউনারি অপারেটর।
এই অপারেটরগুলির মধ্যে অনেকগুলি আসলে এমন পদ্ধতি যা আপনি নিজের ক্লাসে প্রয়োগ করতে পারেন।
আশা করি আপনি এটি দরকারী এবং আকর্ষণীয় পেয়েছেন!
পড়ার জন্য ধন্যবাদ 🙂