অসাধারণ প্রিন্ট হল একটি চমৎকার রত্ন যা আপনার আউটপুটকে irb
এ ফর্ম্যাট করে &pry
এটিকে আরও পঠনযোগ্য করতে।
যেমন…
এটি awesome_print
সহ একটি হ্যাশ প্রদর্শন করে মনে হচ্ছে:
কিন্তু এটা কিভাবে কাজ করে?
"সত্য শুধুমাত্র একটি জায়গায় পাওয়া যাবে:কোড।" - রবার্ট সি. মার্টিন
খোঁজার জন্য সোর্স কোডটি একবার দেখে নেওয়া যাক!
অসাধারণভাবে মুদ্রণ
আমি প্রজেক্ট স্ট্রাকচার (ফাইল এবং ফোল্ডার) এর একটি দ্রুত ওভারভিউ সহ একটি কোড রিডিং সেশন শুরু করতে চাই, তারপর আমি আমার অন্বেষণকে সামনের দিকে ফোকাস করার জন্য একটি প্রশ্ন জিজ্ঞাসা করতে চাই৷
সুতরাং আমি প্রথম যে প্রশ্নটি নিয়ে এসেছি তা হল :
কিভাবে awesome_print
করে pry-এর আউটপুট পরিবর্তন করবেন?
এখন আমি আমার গোয়েন্দা টুপি পরেছি এবং একটি অনুমান করি৷ :
“এই রত্নটি $stdout
প্রতিস্থাপন করতে পারে যাতে এটি প্রিয়ার আউটপুট ক্যাপচার করতে পারে এবং তারপরে এটিকে সুন্দর করে তুলতে পারে।"
কিন্তু এই বাস্তবায়ন আপনাকে আপনার আউটপুট কাস্টমাইজ করার অনুমতি দেবে না, যেমন pretty_print
(রুবির স্ট্যান্ডার্ড লাইব্রেরি থেকে) করে।
এছাড়াও, আমাদের পার্স করতে হবে, বা এমনকি ইভাল কোডও, একটি দুর্দান্ত ধারণা নয়!
পরবর্তী :
আমি এই রত্ন কিভাবে লোড করা হয় তা দেখেছি.
এটি আমাদের কোডে একটি এন্ট্রি পয়েন্ট দেবে৷
৷অসাধারণ প্রিন্ট লোড হচ্ছে
awesome_print
লোড করতে আপনাকে এটি করতে হবে:
require 'awesome_print' AwesomePrint.pry!
এখন আমরা কোথায় pry!
খুঁজতে চাই সংজ্ঞায়িত করা হয়।
আমি এটি খুঁজে পেতে অ্যাটমে "ডিরেক্টরীতে অনুসন্ধান করুন" বৈশিষ্ট্যটি ব্যবহার করেছি।
এখানে কোডটি আছে :
def pry! Pry.print = proc { |output, value| output.puts value.ai } if defined?(Pry) end
মনে হচ্ছে Pry আপনাকে print
এর মান সেট করে এর আউটপুট পরিবর্তন করতে দেয় .
সুতরাং এটি আমাদের "কোথা থেকে শুরু করবেন" প্রশ্নের উত্তর দেয় 🙂
এই "proc" জিনিস সম্পর্কে আরও জানতে চান? "ব্লক, প্রকস এবং ল্যাম্বডাসের চূড়ান্ত নির্দেশিকা" পড়ুন। এটি আমার রুবি ডিপ ডাইভ বই থেকে একটি নমুনা অধ্যায়৷
৷
এই প্রক্রিয়াটি দুটি আর্গুমেন্ট নেয় :
- আউটপুট
- মান
এবং এটি সেই বস্তুগুলিতে দুটি পদ্ধতি কল করে৷
পরবর্তী প্রশ্ন :
এই ai
কি পদ্ধতি?
এটি Kernel
-এ সংজ্ঞায়িত একটি পদ্ধতি মডিউল:
def ai(options = {}) ap = AwesomePrint::Inspector.new(options) awesome = ap.awesome(self) if options[:html] awesome = "</pre>#{awesome}</pre>" awesome = awesome.html_safe if defined? ActiveSupport end awesome end alias :awesome_inspect :ai#{wesome}" awesome =awesome.html_safe যদি সংজ্ঞায়িত করা হয়? ActiveSupport সমাপ্তি awesomeendalias :awesome_inspect :ai
কারণ সমস্ত অবজেক্টে Kernel
অন্তর্ভুক্ত থাকে ডিফল্টরূপে, তাদের এই ai
থাকবে তাদের উপর উপলব্ধ পদ্ধতি।
এখন একটু গভীরে খনন করা যাক এবং দেখুন কিভাবে এই Inspector
ক্লাস কাজ করে।
ইন্সপেক্টর ক্লাস
inspector.rb
খোলার পরপরই আমরা initialize
এর ভিতরে একটি বিশাল অপশন হ্যাশ পাই পদ্ধতি।
এখানে এটির অংশ :
@options = { indent: 4, # Number of spaces for indenting. index: true, # Display array indices. html: false, # Use ANSI color codes rather than HTML. multiline: true, # Display in multiple lines. # ... }
তার পরে আমরা এই কোডটি খুঁজে পেতে পারি :
@formatter = AwesomePrint::Formatter.new(self) @indentator = AwesomePrint::Indentator.new(@options[:indent].abs) Thread.current[AP] ||= []
সুতরাং এটি আরও দুটি অবজেক্ট সেট আপ করে যা কোডের ফর্ম্যাটিং এবং ইন্ডেন্টেশন পরিচালনা করে বলে মনে হয়৷
কিন্তু এই Thread.current
এর সাথে কি আছে জিনিস?
ভাল, এটি আপনাকে বর্তমান থ্রেডে অ্যাক্সেস দেয়। এমনকি আপনি আপনার অ্যাপ্লিকেশনে থ্রেড ব্যবহার না করলেও আপনার কাছে একটি থাকবে, "প্রধান" থ্রেড।
এই AP
ধ্রুবক হল একটি ধ্রুবক যা inspector.rb
এর শীর্ষে সংজ্ঞায়িত করা হয়েছে :
AP = :__awesome_print__
তাহলে এখানে কি হচ্ছে?
অসাধারণ মুদ্রণ Thread.current
ব্যবহার করছে এবং __awesome_print__
কিছু ডেটা সংরক্ষণ করার জন্য কী যা শুধুমাত্র বর্তমান থ্রেডে উপলব্ধ।
মাল্টি-থ্রেডিংয়ের সমস্যা এড়াতে এটি ব্যবহার করা হয়।
অসাধারণ বিন্যাস
আসুন আউটপুট ফরম্যাটিং কোডটি একবার দেখে নেওয়া যাক, যা AwesomePrint::Formatter
এর ভিতরে ঘটে ক্লাস।
এটি যেভাবে কাজ করে তা হল পরিদর্শক (ai
দ্বারা তৈরি করা বস্তু পদ্ধতি) format
কল করবে পদ্ধতি।
def unnested(object) @formatter.format(object, printable(object)) end
তারপর এই format
Formatter
এ পদ্ধতি ক্লাস এই ধরনের বস্তুর সাথে মোকাবিলা করার সর্বোত্তম উপায় খুঁজে পাবে এবং কিছুটা মেটাপ্রোগ্রামিং ব্যবহার করে অন্য পদ্ধতিতে কল করবে।
এখানে পদ্ধতি :
def format(object, type = nil) core_class = cast(object, type) awesome = if core_class != :self send(:"awesome_#{core_class}", object) # Core formatters. else awesome_self(object, type) # Catch all that falls back to object.inspect. end awesome end
এই Formatter
বুঝতে ক্লাস আমাদের cast
-এর দিকেও নজর দিতে হবে পদ্ধতি:
def cast(object, type) CORE.grep(type)[0] || :self end
CORE
ধ্রুবক হল মূল রুবি ক্লাস এবং :self
প্রতিনিধিত্বকারী প্রতীকগুলির একটি বিন্যাস "পাওয়া যায়নি" বোঝাতে ব্যবহৃত একটি প্রতীক (শুধু এই উদাহরণে, সাধারণভাবে রুবিতে নয়)।
CORE = [:array, :bigdecimal, :class, :dir, :file, :hash, :method, :rational, :set, :struct, :unboundmethod]
এটা কি হয় :
যদি ফরম্যাট করা বস্তুটি "কোর ক্লাস" তালিকায় থাকে তাহলে এটি একটি বিশেষ বিন্যাস পাবে।
অন্যথায়, এটি একটি জেনেরিক পাবে।
বিশেষায়িত বিন্যাসগুলি lib/awesome_print/formatters/
-এর অধীনে সংজ্ঞায়িত করা হয়েছে ডিরেক্টরি এবং Array
এর মতো জিনিসগুলি অন্তর্ভুক্ত করুন , Hash
&Class
.
উদাহরণস্বরূপ, এখানে ক্লাসের ফর্ম্যাটার পদ্ধতি রয়েছে:
def format superclass = klass.superclass if superclass colorize("#{klass.inspect} < #{superclass}", :class) else colorize(klass.inspect, :class) end end
আপনি চাইলে আপনার নিজের ফরম্যাটার লিখতে পারেন।
সারাংশ
আপনি অসাধারণ মুদ্রণ রত্ন সম্পর্কে শিখেছেন, যা আপনাকে অ্যারে এবং হ্যাশের মতো বস্তুগুলিকে একটি সুন্দর উপায়ে প্রদর্শন করতে দেয়৷
আশা করি আপনি এটি উপভোগ করেছেন এবং নতুন কিছু শিখেছেন!
অনুগ্রহ করে এখনই আপনার প্রিয় সামাজিক নেটওয়ার্কে এই পোস্টটি শেয়ার করুন যাতে আরো মানুষ জানতে পারে 🙂
৷