একটি নতুন রুবি ম্যাজিক নিবন্ধে স্বাগতম! এই পর্বে, আমরা দেখব কিভাবে রুবি সিনট্যাটিক চিনি ব্যবহার করে এর কিছু সিনট্যাক্সকে আরও অভিব্যক্তিপূর্ণ করতে বা পড়তে সহজ। শেষে, আমরা জানব যে রুবির কিছু কৌশল কীভাবে কাজ করে এবং কীভাবে আমাদের নিজস্ব পদ্ধতি লিখতে হয় যা এই চিনির কিছুটা ব্যবহার করে।
রুবি অ্যাপ লেখার সময় ক্লাস অ্যাট্রিবিউট, অ্যারে এবং হ্যাশের সাথে এমনভাবে ইন্টারঅ্যাক্ট করা সাধারণ ব্যাপার যেটা অ-মানক মনে হতে পারে। অ্যাট্রি বা হ্যাশ থেকে অ্যাট্রিবিউট অ্যাসাইন এবং মান আনতে আমরা কীভাবে পদ্ধতিগুলি সংজ্ঞায়িত করব?
রুবি এই পদ্ধতিগুলিকে কল করার সময় কাজ করার জন্য কিছুটা সিনট্যাকটিক চিনি সরবরাহ করে। এই পোস্টে আমরা এটি কিভাবে কাজ করে তা অন্বেষণ করব।
person1 = Person.new
person1.name = "John"
array = [:foo, :bar]
array[1] # => :bar
hash = { :key => :foo }
hash[:key] # => :foo
hash[:key] = :value
সিনট্যাকটিক চিনি?
সিনট্যাকটিক চিনি ✨ ম্যাজিকের সামান্য অংশকে বোঝায় ✨ রুবি আপনাকে সহজে পড়তে এবং আরও সংক্ষিপ্ত কোড লিখতে দেয়। রুবিতে এর অর্থ হল নির্দিষ্ট চিহ্ন, স্পেস বাদ দেওয়া বা কোনো ধরনের সাহায্যকারীর সাহায্যে কিছু অভিব্যক্তি লেখা।
পদ্ধতির নাম
পদ্ধতির নাম দিয়ে শুরু করা যাক। রুবিতে, আমরা পদ্ধতির নামের জন্য সমস্ত ধরণের অক্ষর এবং বিশেষ চিহ্ন ব্যবহার করতে পারি যা সাধারণত অন্যান্য ভাষায় সমর্থিত নয়। আপনি যদি কখনও একটি Rails অ্যাপ লিখে থাকেন তাহলে সম্ভবত আপনি save!
সম্মুখীন হয়েছেন পদ্ধতি এটি রেলের জন্য নির্দিষ্ট কিছু নয়, তবে এটি !
-এর জন্য সমর্থন প্রদর্শন করে রুবি পদ্ধতির নামের অক্ষর।
একই কথা অন্যান্য চিহ্নের ক্ষেত্রে প্রযোজ্য যেমন =
, [
, ]
, ?
, %
, &
, |
, <
, >
, *
, -
, +
এবং /
.
এই অক্ষরগুলির জন্য সমর্থন মানে আমরা সেগুলিকে আমাদের পদ্ধতির নামগুলিতে অন্তর্ভুক্ত করতে পারি যাতে তারা কীসের জন্য তা সম্পর্কে আরও স্পষ্ট হতে পারে:
- বৈশিষ্ট্য বরাদ্দ করা:
person.name = "foo"
- প্রশ্ন জিজ্ঞাসা করুন:
person.alive?
- বিপজ্জনক পদ্ধতিতে কল করুন:
car.destroy!
- বস্তুগুলিকে এমন কিছু তৈরি করা যা সেগুলি নয়:
car[:wheels]
অ্যাট্রিবিউট পদ্ধতি সংজ্ঞায়িত করা
attr_accessor
সহ একটি ক্লাসে একটি বৈশিষ্ট্য সংজ্ঞায়িত করার সময় , রুবি ক্লাসে ইনস্ট্যান্স ভেরিয়েবলের জন্য একজন পাঠক এবং একজন লেখকের পদ্ধতি তৈরি করে।
class Person
attr_accessor :name
end
person = Person.new
person.name = "John"
person.name # => "John"
হুডের নিচে, রুবি দুটি পদ্ধতি তৈরি করে:
Person#name
attr_reader
ব্যবহার করে ক্লাসে অ্যাট্রিবিউট/ইনস্ট্যান্স ভেরিয়েবল পড়ার জন্য , এবং;Person#name=
attr_writer
ব্যবহার করে ক্লাসে অ্যাট্রিবিউট/ইনস্ট্যান্স ভেরিয়েবল লেখার জন্য .
এখন ধরা যাক আমরা এই আচরণটি কাস্টমাইজ করতে চাই। আমরা attr_accessor
ব্যবহার করব না সাহায্যকারী এবং আমরা নিজেরাই পদ্ধতি সংজ্ঞায়িত করি।
class AwesomePerson
def name
"Person name: #{@name}"
end
def name=(value)
@name = "Awesome #{value}"
end
end
person = AwesomePerson.new
person.name = "Jane"
person.name # => "Person name: Awesome Jane"
name=
এর পদ্ধতির সংজ্ঞা person.name = "Jane"
পদ্ধতিতে কল করার সময় আপনি মোটামুটি একইভাবে এটি লিখবেন . আমরা সমান চিহ্ন =
এর চারপাশে স্পেস সংজ্ঞায়িত করি না এবং পদ্ধতিটি কল করার সময় বন্ধনী ব্যবহার করবেন না।
ঐচ্ছিক বন্ধনী এবং স্পেস
আপনি হয়তো দেখেছেন যে রুবি বন্ধনীতে অনেক সময় ঐচ্ছিক। একটি পদ্ধতিতে একটি আর্গুমেন্ট পাস করার সময়, আমাদের আর্গুমেন্টটিকে বন্ধনীতে মোড়ানোর দরকার নেই ()
, কিন্তু আমরা করতে পারি যদি এটি পড়া সহজ হয়।
যদি-বিবৃতি একটি ভাল উদাহরণ. অনেক ভাষায় আপনি যদি ইফ-স্টেটমেন্টটি বন্ধনী দিয়ে মূল্যায়ন করে অভিব্যক্তিটি মুড়ে দেন। রুবিতে, এগুলি বাদ দেওয়া যেতে পারে৷
৷puts "Hello!" if (true) # With optional parentheses
puts "Hello!" if true # Without parentheses
একই পদ্ধতির সংজ্ঞা এবং অন্যান্য অভিব্যক্তিতে প্রযোজ্য।
def greeting name # Parentheses omitted
"Hello #{name}!"
end
greeting("Robin") # With parentheses
greeting "Robin" # Without parentheses
greeting"Robin" # Without parentheses and spaces
শেষ লাইন পড়া কঠিন, কিন্তু এটা কাজ করে. কলিং পদ্ধতিতেও বন্ধনী এবং স্পেস ঐচ্ছিক।
প্রতিটি বন্ধনী এবং স্থান বাদ না দেওয়ার জন্য সতর্ক থাকুন, এর মধ্যে কিছু রুবিকে আপনি কী বোঝাতে চান তা বুঝতে সাহায্য করে! সন্দেহ হলে, আপনার আর্গুমেন্ট বন্ধনীতে মুড়ে দিন যাতে আপনি এবং রুবি জানতে পারেন কোন আর্গুমেন্টগুলি কোন পদ্ধতির কলের অন্তর্গত।
পদ্ধতিটি কল করার নিম্নলিখিত সমস্ত উপায় সমর্থিত, তবে আমরা সাধারণত বন্ধনী বাদ দেই এবং কোডটিকে আরও পঠনযোগ্য করতে স্পেস যোগ করি৷
# Previous method definition:
# def name=(value)
# @name = "Awesome #{value}"
# end
person.name = "Jane"
person.name="Jane"
person.name=("Jane") # That looks a lot like the method definition!
আমরা এখন name
-এর জন্য কাস্টম অ্যাট্রিবিউট রিডার এবং লেখক পদ্ধতি সংজ্ঞায়িত করেছি বৈশিষ্ট্য আমরা প্রয়োজন অনুযায়ী আচরণ কাস্টমাইজ করতে পারি এবং কলব্যাক ব্যবহার করার পরিবর্তে অ্যাট্রিবিউট অ্যাসাইন করার সময় সরাসরি মানটিতে রূপান্তর করতে পারি।
[ ]
সংজ্ঞায়িত করা পদ্ধতি
পরবর্তী যে জিনিসটি আমরা দেখব তা হল বর্গাকার বন্ধনী পদ্ধতি [ ]
রুবিতে এগুলি সাধারণত অ্যারে ইনডেক্স এবং হ্যাশ কীগুলিতে মান আনতে এবং বরাদ্দ করতে ব্যবহৃত হয়৷
hash = { :foo => :bar, :abc => :def }
hash[:foo] # => :bar
hash[:foo] = :baz # => :baz
array = [:foo, :bar]
array[1] # => :bar
আসুন এই পদ্ধতিগুলি কীভাবে সংজ্ঞায়িত করা হয় তা দেখুন। hash[:foo]
কল করার সময় সেই কাজটি করার জন্য আমরা কিছু রুবি সিনট্যাকটিক চিনি ব্যবহার করছি। এটি লেখার আরেকটি উপায় হল:
hash = { :foo => :bar }
hash.[](:foo)
hash.[]=(:foo, :baz)
# or even:
hash.send(:[], :foo)
hash.send(:[]=, :foo, :baz)
আমরা সাধারণত যেভাবে লিখি তার সাথে তুলনা করে (hash[:foo]
এবং hash[:foo] = :baz
) আমরা ইতিমধ্যে কিছু পার্থক্য দেখতে পাচ্ছি। প্রথম উদাহরণে (hash.[](:foo)
) রুবি বর্গাকার বন্ধনী (hash[:foo]
) এর মধ্যে প্রথম আর্গুমেন্ট সরান ) hash.[]=(:foo, :baz)
কল করার সময় দ্বিতীয় যুক্তিটি hash[:foo] = :baz
মান হিসাবে পদ্ধতিতে প্রেরণ করা হয় .
এটি জেনে, আমরা এখন আমাদের নিজস্ব [ ]
সংজ্ঞায়িত করতে পারি এবং [ ]=
রুবি যেভাবে বুঝবে তার পদ্ধতি।
class MyHash
def initialize
@internal_hash = {}
end
def [](key)
@internal_hash[key]
end
def []=(key, value)
@internal_hash[key] = value
end
end
এখন যেহেতু আমরা জানি যে এই পদ্ধতিগুলি সাধারণ রুবি পদ্ধতি, আমরা অন্য যে কোনও পদ্ধতির মতো একই যুক্তি প্রয়োগ করতে পারি। এমনকি আমরা এটিকে অদ্ভুত জিনিসগুলিও করতে পারি যেমন [ ]
-এ একাধিক কীকে অনুমতি দেওয়া পদ্ধতি।
class MyHash
def initialize
@internal_hash = { :foo => :bar, :abc => :def }
end
def [](*keys)
@internal_hash.values_at(*keys)
end
end
hash = MyHash.new
hash[:foo, :abc] # => [:bar, :def]
আপনার নিজের তৈরি করুন
এখন যেহেতু আমরা রুবির সিনট্যাকটিক চিনি সম্পর্কে কিছুটা জানি, আমরা আমাদের নিজস্ব পদ্ধতি যেমন কাস্টম লেখক, হ্যাশ-এর মতো ক্লাস এবং আরও অনেক কিছু তৈরি করতে এই জ্ঞান প্রয়োগ করতে পারি।
আপনি অবাক হতে পারেন যে কতগুলি রত্ন পদ্ধতি সংজ্ঞায়িত করে যেমন বর্গাকার বন্ধনী পদ্ধতিগুলিকে একটি অ্যারে বা হ্যাশের মতো অনুভব করার জন্য যখন এটি সত্যিই নয়। একটি উদাহরণ হল একটি Rails অ্যাপ্লিকেশনে একটি ফ্ল্যাশ বার্তা সেট করা যার সাথে:flash[:alert] = "An error occurred"
. AppSignal রত্ন-এ আমরা এটি নিজেরাই Config
-এ ব্যবহার করি কনফিগারেশন আনার জন্য শর্টহ্যান্ড হিসেবে ক্লাস।
এটি রুবিতে পদ্ধতি সংজ্ঞা এবং কল করার জন্য সিনট্যাকটিক চিনির আমাদের সংক্ষিপ্ত চেহারাটি শেষ করে। আমরা জানতে চাই যে আপনি এই নিবন্ধটি কেমন পছন্দ করেছেন, যদি এটি সম্পর্কে আপনার কোনো প্রশ্ন থাকে এবং আপনি পরবর্তীতে কী পড়তে চান, তাই @AppSignal-এ আমাদের জানাতে ভুলবেন না।