কিছু কুল রুবি ট্রিক খুঁজছেন?
আপনি পেয়ে গেলেন!
এই আর্টিকেলে আমি আমার কিছু ফেভারিট শেয়ার করতে চাই।
সামগ্রী
- ১ ডিপ কপি
- ২ ল্যাম্বডা কল করার বিভিন্ন পদ্ধতি
- ৩ প্রি-ফিলড অ্যারে তৈরি
- ৪ true, false এবং nil হলো অবজেক্ট
- ৫ ল্যাম্বডা আর্গুমেন্টে স্ট্রিক্ট, কিন্তু প্রক কেয়ার করে না
- ৬ IRB বা ফাইল ছাড়া সরাসরি কোড এক্সিকিউট
- ৭ এক কমান্ডে আপনার নিজস্ব মিনি-IRB
- ৮ অবজেক्ट আনফ্রিজ করা (ঝুঁকিপূর্ণ!)
- ৯ স্পেশাল আইডেন্টিটি वाले অবজেক্ট
- ১০ IRB বা Pry-এ বড় আউটপুট এড়ানো
- ১১ caller মেথড ব্যবহার করে কারেন্ট কল স্ট্যাক পাওয়া
- ১২ বোনাস! যেকোনো ভ্যালু বুলিয়ানে কনভার্ট
- ১৩ বোনাস! একটি কীওয়ার্ডকে ভেরিয়েবল নাম হিসেবে ব্যবহার
- ১৪ সারাংশ
- ১৪.১ রিলেটেড
ডিপ কপি
আপনি যখন অন্য অবজেক্ট ধারণকারী একটি অবজেক্ট copy করেন, যেমন একটি Array, তবে শুধু এই অবজেক্টগুলোর রেফারেন্স কপি হয়।
এটি একশনে দেখতে পারেন এখানে:
food = %w( bread milk orange ) food.map(&:object_id) # [35401044, 35401020, 35400996] food.clone.map(&:object_id) # [35401044, 35401020, 35400996]
Marshal ক্লাস ব্যবহার করে, যা সাধারণত সিরিয়ালাইজেশনের জন্য ব্যবহৃত হয়, আপনি একটি অবজেক্টের ‘ডিপ কপি’ তৈরি করতে পারেন।
def deep_copy(obj) Marshal.load(Marshal.dump(obj)) end
ফলাফল:
deep_copy(food).map(&:object_id) # [42975648, 42975624, 42975612]
ল্যাম্বডা কল করার বিভিন্ন পদ্ধতি
my_lambda = -> { puts 'Hello' } my_lambda.call my_lambda[] my_lambda.() my_lambda.===
সম্ভব হলে আপনাকে প্রথমটি (call) ব্যবহার করা উচিত, কারণ এটি সবচেয়ে পরিচিত।
প্রি-ফিলড অ্যারে তৈরি
Array ক্লাস একটি আর্গুমেন্ট এবং একটি ব্লক নিতে পারে, যা আপনাকে n এলিমেন্ট বিশিষ্ট একটি অ্যারে তৈরি করতে দেয়। ডিফল্টভাবে এগুলো nil, কিন্তু আপনার ব্লক থাকলে ভ্যালুগুলো সেখান থেকে আসবে।
উদাহরণ:
Array.new(10) { rand 300 }
এটি ১০টি র্যান্ডম নাম্বার বিশিষ্ট একটি অ্যারে জেনারেট করবে যেগুলো ০ থেকে ২৯৯ এর মাঝপথে।
True, False এবং Nil হলো অবজেক্ট
true.class # TrueClass false.class # FalseClass nil.class # NilClass
এই অবজেক্টগুলোর শুধু একটি কপি রয়েছে, এবং আপনি চাইলেও আর তৈরি করতে পারবেন না।
এটি সিঙ্গলটন প্যাটার্নের একশন।
ল্যাম্বডা আর্গুমেন্টে স্ট্রিক্ট, কিন্তু প্রক কেয়ার করে না
my_lambda = ->(a, b) { a + b } my_proc = Proc.new { |a, b| a + b } my_lambda.call(2) # ArgumentError: wrong number of arguments (1 for 2) my_proc.call(2) # TypeError: nil can't be coerced into Fixnum
IRB বা ফাইল ছাড়া সরাসরি কোড এক্সিকিউট
ruby কমান্ডের কিছু আকর্ষণীয় অপশন রয়েছে যা আপনি ব্যবহার করতে পারেন।
উদাহরণস্বরূপ, -e ফ্ল্যাগ দিয়ে আপনি এক্সিকিউট করার জন্য একটি কোড স্নিপেট পাস করতে পারেন।
ruby -e '5.times { puts "Fun with Ruby" }'
আপনি -h ফ্ল্যাগ ব্যবহার করে আরও খুঁজে পেতে পারেন।
এক কমান্ডে আপনার নিজস্ব মিনি-IRB
কখনো কি জানতে চেয়েছেন irb কীভাবে কাজ করে? খুবি, এটি এর একটি সুপার-সিম্পল ভার্শন।
যাদ রাখুন ‘REPL’ মানে কী: Read-Eval-Print Loop।
ruby -n -e 'p eval($_)'
আপনাকে প্রম্পট মिलेगा না, কিন্তু আগে যান এবং কিছু রুবি কোড টাইপ করুন।
"A" * 5 "AAAAA"
এটি কাজ করে কারণ -n ফ্ল্যাগটি এটি করে:
-n assume 'while gets(); ... end' loop around your script
এবং $_ একটি গ্লোবাল ভেরিয়েবল। যেটি ধারণ করে:
The last input line of string by gets or readline.
অবজেক্ট আনফ্রিজ করা (ঝুঁকিপূর্ণ!)
অবজেক্ট আনফ্রিজ করার কোনো রুবি মেথড নেই, কিন্তু Fiddle ক্লাস ব্যবহার করে আপনি রুবি ইন্টারনালসে ঢুকেও এটি করতে পারেন।
require 'fiddle' str = 'water'.freeze str.frozen? # true memory_address = str.object_id * 2 Fiddle::Pointer.new(memory_address)[1] &= ~8 str.frozen? # false
বাড়িতে ট্রাই করবেন না!
স্পেশাল আইডেন্টিটি वाले অবজেক্ট
রুবি অবজেক্টের একটি আইডেন্টিফায়ার বা ‘id’ নম্বর থাকে যা আপনি object_id মেথড দিয়ে এক্সেস করতে পারেন। কিছু অবজেক্টের ফিক্সড আইডি থাকে: Fixnums, true, false এবং nil।
false.object_id # 0 true.object_id # 2 nil.object_id # 4 1.object_id # 3 2.object_id # 5
Fixnum আইডি এই ফর্মুলা ব্যবহার করে: (number * 2) + 1।
বোনাস: সর্বোচ্চ Fixnum হলো 1073741823, এর পরে আপনি Bignum অবজেক্ট পাবেন।
IRB বা Pry-এ বড় আউটপুট এড়ানো
আপনি যদি irb-এ কাজ করছেন এবং কোনো খুব বড় অ্যারে বা স্ট্রিংয়ের কন্টেন্ট দিয়ে আপনার স্ক্রিন ফুল করে ফেলতে চান না তবে আপনি আপনার কোডের শেষে শুধু ; যোগ করুন।
উদাহরণ:
require 'rest-client' RestClient.get('www.rubyguides.com');
; ছাড়া আবার ট্রাই করুন পার্থক্য দেখতে 🙂
caller মেথড ব্যবহার করে কারেন্ট কল স্ট্যাক পাওয়া
এখানে একটি কোড উদাহরণ:
def foo bar end def bar puts caller end foo
আউটপুট:
-:3:in 'foo' -:10:in '<main>'
আপনার যদি কারেন্ট মেথডের নাম জানতে হয় তবে আপনি __method__ বা __callee__ ব্যবহার করতে পারেন।
বোনাস! যেকোনো ভ্যালু বুলিয়ানে কনভার্ট
!!(1) # true !!(nil) # false
বোনাস! একটি কীওয়ার্ডকে ভেরিয়েবল নাম হিসেবে ব্যবহার
def foo (if: nil) binding.local_variable_get(:if) end foo(if: true)
সারাংশ
আশা করি এই রুবি ট্রিকগুলো আপনার ভালো লাগলো!
তাদের সাথে শেয়ার করুন যাতে তারা ও এনজয় করতে পারে এবং নিচের ফর্মে আমার ব্লগ সাবস্ক্রাইব করুন যাতে আমার পরবর্তী পোস্ট মিস না হয়। 🙂