উত্তর:
একে নিরাপদ নেভিগেশন অপারেটর বলা হয়। রুবি ২.৩.০ এ পরিচয় করিয়ে দেওয়া, এটি আপনাকে উদ্বেগ ছাড়াই অবজেক্টগুলিতে পদ্ধতিগুলি কল করতে দেয় যাতে অবিলগুলি nil( undefined method for nil:NilClassত্রুটি এড়ানো ), tryরেলগুলির পদ্ধতির মতো ।
সুতরাং আপনি লিখতে পারেন
@person&.spouse&.name
পরিবর্তে
@person.spouse.name if @person && @person.spouse
দস্তাবেজ থেকে :
my_object.my_methodএটি আমার_মোবজেক্টে আমার_মোহিত বার্তা প্রেরণ করে। যে কোনও বস্তু রিসিভার হতে পারে তবে পদ্ধতির দৃশ্যমানতার উপর নির্ভর করে কোনও বার্তা প্রেরণ একটি নোমথোডেরর বাড়াতে পারে।
আপনি & ব্যবহার করতে পারেন। কোনও রিসিভারকে মনোনীত করতে, তারপরে আমার_সেম্পোডটি চালিত হয় না এবং যখন রিসিভারটি শূন্য হয় তখন ফলাফলটি শূন্য হয়। সেক্ষেত্রে আমার_মোথার যুক্তিগুলি মূল্যায়ন করা হয় না।
দ্রষ্টব্য: যদিও @ সন্তোষ একটি সুস্পষ্ট এবং পূর্ণ উত্তর দিয়েছে, আমি আরও কিছু পটভূমি যুক্ত করতে চাই এবং নন ইনস্ট্যান্স ভেরিয়েবলগুলির সাথে এর ব্যবহার সম্পর্কিত একটি গুরুত্বপূর্ণ নোট যুক্ত করব ।
একে " সেফ নেভিগেশন অপারেটর " ( ওরফে "ptionচ্ছিক চেইনিং অপারেটর", "নাল-কন্ডিশনাল অপারেটর" ইত্যাদি ) বলা হয়। ম্যাটজ এটিকে "একাকী অপারেটর" বলে মনে করছেন। এটি রুবি ২.৩ এ প্রবর্তিত হয়েছিল । এটি কোনও অবজেক্টের কাছে কেবল তখনই কোনও পদ্ধতি প্রেরণ করে nil।
# Call method `.profile` on `user` only if `user` is not `nil`
@user&.profile
# Equivalent to
unless @user.nil?
@user.profile
end
দয়া করে নোট করুন, উপরের কোডটি উদাহরণ ভেরিয়েবল ব্যবহার করে। আপনি যদি স্থানীয় ভেরিয়েবলগুলি সহ নিরাপদ নেভিগেশন অপারেটরটি ব্যবহার করতে চান তবে আপনাকে দেখতে হবে আপনার স্থানীয় ভেরিয়েবলগুলি প্রথমে সংজ্ঞায়িত হয়েছে।
# `user` local variable is not defined previous
user&.profile
# This code would throw the following error:
NameError: undefined local variable or method `user' for main:Object
এই সমস্যাটি সমাধানের জন্য, আপনার স্থানীয় ভেরিয়েবলটি প্রথমে সংজ্ঞায়িত হয়েছে কিনা তা পরীক্ষা করে দেখুন:
# Option 1: Check the variable is defined
if defined?(user)
user&.profile
end
# Option 2: Define your local variable. Example, set it to nil
user = nil
user&.profile # Works and does not throw any errors
রেলের এমন tryপদ্ধতি রয়েছে যা মূলত একই রকম হয়। এটি sendএকটি পদ্ধতি কল করার জন্য অভ্যন্তরীণভাবে পদ্ধতি ব্যবহার করে । ম্যাটজ পরামর্শ দিলেন যে এটি ধীর এবং এটি একটি অন্তর্নির্মিত ভাষা বৈশিষ্ট্য হওয়া উচিত।
অন্যান্য অনেক প্রোগ্রামিং ভাষার একই বৈশিষ্ট্য রয়েছে: অবজেক্টিভ সি, সুইফ্ট, পাইথন, স্কালা, কফি স্ক্রিপ্ট ইত্যাদি S তবে, একটি সাধারণ বাক্য গঠন ?.(প্রশ্ন বিন্দু) question তবে, এই সিনট্যাক্সটি রুবি গ্রহণ করতে পারেন নি। কারণ ?পদ্ধতির নামগুলিতে অনুমতি দেওয়া হয়েছিল এবং সুতরাং, ?.প্রতীক ক্রমটি ইতিমধ্যে একটি বৈধ রুবি কোড। উদাহরণ স্বরূপ:
2.even?.class # => TrueClass
সে কারণেই রুবি সম্প্রদায়কে বিভিন্ন সিনট্যাক্স নিয়ে আসতে হয়েছিল। এটি একটি সক্রিয় আলোচনা ছিল এবং বিভিন্ন অপশন হিসেবে বিবেচনা করা হতো ( .?, ?, &&, ইত্যাদি)। এখানে কিছু বিবেচনার তালিকা রয়েছে:
u.?profile.?thumbnails
u\profile\thumbnails
u!profile!thumbnails
u ? .profile ? .thumbnails
u && .profile && .thumbnails
# And finally
u&.profile&.thumbnails
বাক্য গঠনটি বেছে নেওয়ার সময়, বিকাশকারীরা বিভিন্ন প্রান্তের কেসগুলি দেখেছিলেন এবং আলোচনাটি বেশ কার্যকর। আপনি যদি অপারেটরের সমস্ত রূপ এবং সংক্ষিপ্তসারটি দেখতে চান তবে দয়া করে অফিসিয়াল রুবি ইস্যু ট্র্যাকারটিতে এই বৈশিষ্ট্যটির পরিচিতি দেখুন ।
.?এবং অন্যান্য বিকল্পগুলি বিবেচনা করা &.হয়েছিল তবে তা নির্বাচিত হয়েছিল! সুতরাং, শুধুমাত্র &.কাজ করবে।
&.এবং .?আমার খারাপ। আমার উত্তর আপডেট। সতর্ক থাকুন জন্য ধন্যবাদ!
user.?profileহওয়া উচিত user&.profile(এটি নিজেই সম্পাদনা করতে পারছেন না কারণ এটি কেবল 1 অক্ষর সম্পাদনা!)।
সতর্ক হতে হবে! নিরাপদ নেভিগেশন অপারেটর সুবিধাজনক হলেও এটির সাথে আপনার যুক্তি পরিবর্তন করার পক্ষে নিজেকে চালিত করাও সহজ। আমি প্রবাহ নিয়ন্ত্রণে এর ব্যবহার এড়ানো পরামর্শ দিচ্ছি। উদাহরণ:
str = nil
puts "Hello" if str.nil? || str.empty?
# The above line is different than the below line
puts "Hello" if str&.empty?
প্রথম উদাহরণে, str.nil?রিটার্ন দেয় trueএবং str.empty?কখনই ডাকা হয় না, যার ফলে putsবিবৃতি কার্যকর হয়। তবে দ্বিতীয় উদাহরণে, str&.empty?রিটার্নগুলি nilমিথ্যা, এবং putsবিবৃতি কখনই কার্যকর হয় না।
str.nil?সত্য (যেমন আপনি বলেছেন) যার অর্থ str.empty?আসলে একেবারেই ডাকা হবে না (এটি ||অপারেটর কীভাবে কাজ করে)। আপনার বাকী বাক্যটি সঠিক।
puts "hello" unless str&.present?(কেবলমাত্র বর্তমানের জন্য রেল? পদ্ধতি)
এটি নীল চেকের জন্য যেমন কোটলিন এবং সুইফ্টে ব্যবহৃত হয় উদাহরণস্বরূপ; অবজেক্ট -> সুইফট এবং কোটলিন সহ
model = car?.model
এই মডেলটি শূন্য (সুইফ্ট) বা নাল (কোটলিন) হতে পারে যদি আমরা গাড়ী শ্রেণিতে মডেল মানটি সংজ্ঞায়িত না করি। আমরা রুবিতে প্রশ্ন চিহ্নের পরিবর্তে সেই অ্যাম্পারস্যান্ড ব্যবহার করি
model = car&.model
যদি অ্যাম্পারস্যান্ড ছাড়াই car.model ব্যবহার করেন এবং যদি মডেল শূন্য থাকে তবে সিস্টেমটি চলতে পারে না।
try!পদ্ধতিটির মতো কাজ করে , নাtry