অ্যারেগুলির উপর পুনরাবৃত্তি করার সময়, শর্টহ্যান্ডের এক টুকরো আছে যা আমি নিজেকে বারবার ব্যবহার করি। এটি হল &:ট্রিক, ওরফে "অ্যাম্পারস্যান্ড কোলন" বা "প্রেটজেল কোলন"। আপনি যদি এটির সাথে পরিচিত না হন তবে এটি কীভাবে কাজ করে তা এখানে রয়েছে:
words = ["would", "you", "like", "to", "play", "a", "game?"]
# this...
words.map &:length
# ..is equivalent to this:
words.map { |w| w.length }
সম্প্রতি অবধি, আমি ধরে নিয়েছিলাম যে &:সিনট্যাক্স একটি অপারেটর ছিল। কিন্তু এটা না. এটি একটি চতুর হ্যাক যা ActiveSupport-এ শুরু হয়েছিল এবং Ruby 1.8.7-এ একটি অফিসিয়াল বৈশিষ্ট্য হয়ে উঠেছে।
The &operator
AND লজিক অপারেশনের জন্য ব্যবহার করা ছাড়াও, "&" অক্ষরের রুবিতে আরেকটি ব্যবহার রয়েছে। একটি মেথড আর্গুমেন্টের শুরুতে যোগ করা হলে, এটি তার অপারেন্ডে to_proc কল করে এবং এটিকে ব্লক হিসাবে পাস করে। ওটা একটা মুখের কথা। উদাহরণটি দেখতে অনেক সহজ:
def my_method(&block)
block.call
end
class Greeter
def self.to_proc
Proc.new { "hello" }
end
end
my_method(&Greeter) # returns "hello"
চিহ্ন#to_proc
আপনি একটি to_proc
যোগ করতে পারেন প্রতীক সহ যেকোনো বস্তুর পদ্ধতি। রুবি &:
-এর অনুমতি দিতে ঠিক এটাই করে শর্টকাট এটা এই মত কিছু দেখায়:
class Symbol
def to_proc
Proc.new do |item|
item.send self
end
end
end
কাদা হিসাবে পরিষ্কার? গুরুত্বপূর্ণ অংশ হল item.send(self)
. স্বয়ং, এই ক্ষেত্রে প্রতীককে বোঝায়।
এটি সব একসাথে রাখা
each
এর মত গননাযোগ্য পদ্ধতি এবং map
একটি ব্লক গ্রহণ করুন। প্রতিটি আইটেমের জন্য তারা ব্লককে কল করে এবং এটিকে আইটেমের একটি রেফারেন্স দেয়। এই ক্ষেত্রে ব্লকটি প্রতীকে to_proc কল করার মাধ্যমে তৈরি করা হয়।
# &:name evaluates to a Proc, which does item.send(:name)
items.map(&:name)
এই সম্পর্কে আকর্ষণীয় বিষয় হল যে map
জানেন না যে এর কোনোটিই চলছে! বেশিরভাগ কাজ :name
দ্বারা করা হচ্ছে প্রতীক এটা অবশ্যই চতুর...আমার স্বাদের জন্য প্রায় খুব চতুর। কিন্তু এটি এই মুহুর্তে বছরের পর বছর ধরে রুবির স্ট্যান্ডার্ড লাইব্রেরির একটি অংশ, এবং এটি এত সহজ যে আমি এখনই এটি ব্যবহার করা বন্ধ করব সন্দেহ নেই। :)