ক্রিসমাসে নতুন রুবি সংস্করণ প্রকাশ করা একটি ঐতিহ্য হয়ে উঠেছে।
এবং এই পোস্টে আমি রুবি 2.4 এর কিছু সবচেয়ে আকর্ষণীয় পরিবর্তনগুলি কভার করতে চাই যাতে আপনি খবরের সাথে সাথে থাকতে পারেন 🙂
কিওয়ার্ড দিয়ে #বৃত্তাকার ভাসা
আপনি যদি আপনার অ্যাপে ফ্লোট ব্যবহার করেন তাহলে আমি আশা করি আপনি floor ব্যবহার করবেন অথবা ceil রাউন্ডিংয়ের জন্য, কারণ ফ্লোট#রাউন্ড পদ্ধতি রুবি 2.4-এ তার ডিফল্ট আচরণ পরিবর্তন করছে।
উদাহরণ :
# Ruby 2.3 (2.5).round 3 # Ruby 2.4 (2.5).round 2
ডিফল্ট আচরণ এখন "গোল-থেকে-নিকটে-এমন"।
আপডেট :
৷Float#round-এর ডিফল্ট আচরণRuby 2.4এর চূড়ান্ত সংস্করণে "রাউন্ডিং আপ" এ ফিরে এসেছে৷ . এই পোস্টটি মূলত প্রকাশিত হওয়ার পরে এটি Matz দ্বারা নেওয়া একটি সিদ্ধান্ত ছিল৷
এছাড়াও, Float#round এখন একটি আর্গুমেন্ট নেয় যা আপনি যে ধরনের রাউন্ডিং চান তা নির্ধারণ করতে ব্যবহার করতে পারেন।
বিকল্পগুলি হল:
- :এমনকি
- :up
- :down
উদাহরণ :
(4.5).round(half: :up) 5
এছাড়াও Float#floor , Float#ceil &Float#truncate এখন একটি ঐচ্ছিক যুক্তি নিন যা আপনাকে একটি নির্ভুলতা সেট করতে দেয়।
IO পদ্ধতির জন্য চম্প পতাকা
আপনি যদি কখনও gets বা each_line এর মতো একটি পদ্ধতি ব্যবহার করেন তবে আমি নিশ্চিত যে আপনি সেই বিরক্তিকর নতুন লাইন অক্ষরগুলির সাথে মোকাবিলা করার কথা মনে রাখবেন৷
যেগুলো দেখতে এইরকম:\n .
এটি এমন কিছু যা নতুনদের সর্বদা সমস্যায় পড়ে, তবে এই নতুন বৈশিষ্ট্যটি সাহায্য করতে সক্ষম হতে পারে!
এখানে একটি উদাহরণ:
input = gets.chomp # "abc\n"
এখন Ruby 2.4 এ আপনি chomp সেট করতে পারবেন কীওয়ার্ড আর্গুমেন্ট এবং gets আপনার জন্য নতুন লাইন অক্ষর মুছে ফেলবে।
উদাহরণ :
input = gets(chomp: true) # "abc"
এটি false নয় এমন যেকোনো মান নিয়ে কাজ করবে অথবা nil (রুবিতে একমাত্র "ভুল" মান)।
সুতরাং এটিও কাজ করে (তবে সুপারিশ করা হয় না কারণ এটি বিভ্রান্তিকর হতে পারে):
input = gets(chomp: 1234) # "abc"
এটা খুব বড় কিছু নয়, কিন্তু এটি আপনাকে একটি মেথড কল 🙂
বাঁচাতে পারেপাথনাম#খালি?
রুবি 2.4 Dir#empty? প্রয়োগ করে &File#empty? , এই পদ্ধতিগুলি আপনাকে একটি ডিরেক্টরি বা একটি ফাইল খালি কিনা তা পরীক্ষা করতে দেয় (এটি বেশ স্পষ্ট ছিল, তাই না?)।
কিন্তু Pathname#empty? এছাড়াও সম্প্রতি যোগ করা হয়েছে৷
আপনি যদি Pathname এর সাথে পরিচিত না হন , এটি এমন একটি শ্রেণী যা Dir উভয়ের কার্যকারিতাকে একত্রিত করে ক্লাস এবং File ক্লাস।
উপরন্তু, এটি আরও "OO" (অবজেক্ট ওরিয়েন্টেড) এই অর্থে যে এটি Pathname প্রদান করে বস্তু, স্ট্রিং এর পরিবর্তে।
উদাহরণ :
Pathname.empty?("file or directory name")
প্রতিশ্রুতি দিন:https://github.com/ruby/ruby/commit/9373c5efb993dd8cae0526118805449b19af2c22
তুলনা_by_identity সেট করুন
সেট হল একটি ডেটা স্ট্রাকচার যা স্ট্যান্ডার্ড লাইব্রেরির অংশ হিসেবে পাওয়া যায়। এটি আপনাকে অনন্য আইটেমের সংগ্রহ রাখতে সাহায্য করে।
ডিফল্টরূপে বস্তুর তুলনা করা হয় তাদের মানের উপর ভিত্তি করে (অথবা আরো নির্ভুল হতে, তাদের হ্যাশ মানের উপর ভিত্তি করে)।
কিন্তু রুবি 2.4-এ তাদের অবজেক্ট আইডির উপর ভিত্তি করে অনন্য বস্তুর সেট থাকা সম্ভব।
উদাহরণ :
require 'set' # Normal set set = Set.new set << 123 << 123 << "abc" << "abc" # [123, "abc"] # Identity set set = Set.new().compare_by_identity set << 123 << 123 << "abc" << "abc" # [123, "abc", "abc"]
যদি কেউ এই বৈশিষ্ট্যটির জন্য কোন আকর্ষণীয় ব্যবহার সম্পর্কে জানেন তবে একটি মন্তব্য করুন 🙂
প্রতিশ্রুতি দিন:https://github.com/ruby/ruby/commit/76977611dd68e384fdce8c546efda5e1931e67a6
কার্নেল#send, BasicObject#send সহ পরিমার্জন , প্রতীক#to_proc
আমি এখানে বিশদভাবে পরিমার্জনগুলি কভার করতে যাচ্ছি না, তবে মূল ধারণাটি হল String এর মতো একটি ক্লাসে পদ্ধতি যোগ করতে সক্ষম হওয়া। , এই পরিবর্তনটিকে একটি ফাইল বা ক্লাসে "স্থানীয়" রাখার সময়।
রুবি 2.4 থেকে, Kernel#send এর মত পদ্ধতির মাধ্যমে কল করা হলে পরিশোধনের মাধ্যমে সংজ্ঞায়িত পদ্ধতিগুলি উপলব্ধ হবে &Symbol#to_proc .
উদাহরণ :
module TenTimes
refine String do
def ten_times
puts self * 10
end
end
end
class Thing
using TenTimes
"abc".send(:ten_times)
end
আপনি যদি এটি 2.3 বা নীচে চেষ্টা করেন তবে আপনি একটি 'অনির্ধারিত পদ্ধতি' ত্রুটি পাবেন৷
প্রতিশ্রুতি দিন:https://github.com/ruby/ruby/commit/35a29390197750abf97ef16fa0740e377764daef
Hash#transform_values
এখানে আরেকটি পদ্ধতি রেল থেকে বের করা হয়েছে এবং সরাসরি রুবিতে আসছে। আমি Hash#transform_values এর কথা বলছি , যা Array#map এর অনুরূপভাবে কাজ করে .
উদাহরণ :
h = {a: 1, b: 2, c: 3}
h.transform_values { |v| v * 10 }
# {a: 10, b: 20, c: 30}
এছাড়াও Hash#transform_values! আছে আপনার যদি ইন-প্লেস মিউটেশনের প্রয়োজন হয়।
Kernel#clone এখন একটি ঐচ্ছিক কীওয়ার্ড আর্গুমেন্ট নেয়
আপনি হয়তো জানেন, রুবি বস্তুর একটি অনুলিপি তৈরি করা সম্ভব। এটি দরকারী কারণ বেশিরভাগ রুবি বস্তু পরিবর্তনযোগ্য এবং আপনি মূল বস্তুতে পরিবর্তন করা এড়াতে চাইতে পারেন।
বস্তুর অনুলিপি তৈরি করার জন্য আমাদের দুটি পদ্ধতি রয়েছে:
- ক্লোন
- ডুপ
ক্লোন এবং ডুপের মধ্যে কয়েকটি ছোট পার্থক্য রয়েছে, তবে এই পোস্টের জন্য শুধু বলা যাক যে clone dup থাকাকালীন মূল বস্তুর "হিমায়িত" অবস্থা রাখে করে না।
2.4-এ নতুন হল clone কল করার ক্ষমতা একটি "ফ্রিজ" পতাকা সহ৷
উদাহরণ :
foo = "test".freeze boo = foo.clone(freeze: false) boo.frozen? # false
আমি নিশ্চিত নই যে এটি কী প্রসারিত করা কার্যকর, তবে কে আরও বিকল্প চায় না 🙂
প্রতিশ্রুতি দিন:https://github.com/ruby/ruby/commit/320ae01c5fb091eab0926c186f304a9caeda1ace
Thread.report_on_exception
2.4 এর সাথে আসা আরেকটি বৈশিষ্ট্য হল Thread.report_on_exception। এটি প্রস্তাব করা হয়েছিল কারণ থ্রেড ব্যতিক্রমগুলি ডিফল্টরূপে নীরব থাকে এবং এটি আপনার কোডের সমস্যাগুলি লুকিয়ে রাখতে পারে৷
ডিফল্ট মান হল false , কিন্তু যদি আপনার অ্যাপটি থ্রেড ব্যবহার করে থাকে তাহলে রুবি 2.4 এ আপগ্রেড করার সময় আপনার এটি সক্ষম করার চেষ্টা করা উচিত।
উদাহরণ :
Thread.report_on_exception = true t1 = Thread.new do puts "In new thread" raise "Exception from thread" end sleep(1) puts "In the main thread"
এটি ব্যতিক্রম দেখাবে, কিন্তু এটি আপনার প্রোগ্রাম ক্র্যাশ করবে না। বিকল্পটি হল Thread.abort_on_exception, যা সবসময় পাওয়া যায়।
লক্ষ্য করুন যে এই পদ্ধতির একটি উদাহরণ সংস্করণও রয়েছে, তাই আপনি সমস্ত থ্রেডের পরিবর্তে এই বিকল্পটি প্রতি-থ্রেড সেট করতে পারেন৷
বাইন্ডিং#irb
আপনি কি binding.pry ব্যবহার করার ভক্ত ডিবাগ করার জন্য? আচ্ছা এখন আমাদের binding.irb আছে যা একইভাবে কাজ করে।
কিন্তু যেহেতু এটি irb, আপনি এখনও সেই সব সুন্দর জিনিস পান না যা আপনাকে দেয়, যেমন সিনট্যাক্স হাইলাইটিং।
কোনো কারণে আপনার কাছে প্রি 🙂
অ্যাক্সেস না থাকলে কিছুই না হওয়া ভালোপ্রতিশ্রুতি দিন:https://github.com/ruby/ruby/commit/493e48897421d176a8faf0f0820323d79ecdf94a
উপসংহার
রুবির এই নতুন সংস্করণটি অনেক আকর্ষণীয় বৈশিষ্ট্য নিয়ে এসেছে, তাই এটি উপলব্ধ হলে এটি পরীক্ষা করে দেখুন৷
এই পোস্টটি শেয়ার করতে ভুলবেন না যাতে আরও লোকেরা শিখতে পারে৷ রুবি 2.4-এ এই নতুন বৈশিষ্ট্যগুলি সম্পর্কে!