কি করে &. (অ্যাম্পারস্যান্ড ডট) মানে রুবি?


উত্তর:


205

একে নিরাপদ নেভিগেশন অপারেটর বলা হয়। রুবি ২.৩.০ এ পরিচয় করিয়ে দেওয়া, এটি আপনাকে উদ্বেগ ছাড়াই অবজেক্টগুলিতে পদ্ধতিগুলি কল করতে দেয় যাতে অবিলগুলি nil( undefined method for nil:NilClassত্রুটি এড়ানো ), tryরেলগুলির পদ্ধতির মতো ।

সুতরাং আপনি লিখতে পারেন

@person&.spouse&.name

পরিবর্তে

@person.spouse.name if @person && @person.spouse

দস্তাবেজ থেকে :

my_object.my_method

এটি আমার_মোবজেক্টে আমার_মোহিত বার্তা প্রেরণ করে। যে কোনও বস্তু রিসিভার হতে পারে তবে পদ্ধতির দৃশ্যমানতার উপর নির্ভর করে কোনও বার্তা প্রেরণ একটি নোমথোডেরর বাড়াতে পারে।

আপনি & ব্যবহার করতে পারেন। কোনও রিসিভারকে মনোনীত করতে, তারপরে আমার_সেম্পোডটি চালিত হয় না এবং যখন রিসিভারটি শূন্য হয় তখন ফলাফলটি শূন্য হয়। সেক্ষেত্রে আমার_মোথার যুক্তিগুলি মূল্যায়ন করা হয় না।


13
আসলে, এটি try!পদ্ধতিটির মতো কাজ করে , নাtry
গ্রজেগোর্জ

58

দ্রষ্টব্য: যদিও @ সন্তোষ একটি সুস্পষ্ট এবং পূর্ণ উত্তর দিয়েছে, আমি আরও কিছু পটভূমি যুক্ত করতে চাই এবং নন ইনস্ট্যান্স ভেরিয়েবলগুলির সাথে এর ব্যবহার সম্পর্কিত একটি গুরুত্বপূর্ণ নোট যুক্ত করব


একে " সেফ নেভিগেশন অপারেটর " ( ওরফে "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

বাক্য গঠনটি বেছে নেওয়ার সময়, বিকাশকারীরা বিভিন্ন প্রান্তের কেসগুলি দেখেছিলেন এবং আলোচনাটি বেশ কার্যকর। আপনি যদি অপারেটরের সমস্ত রূপ এবং সংক্ষিপ্তসারটি দেখতে চান তবে দয়া করে অফিসিয়াল রুবি ইস্যু ট্র্যাকারটিতে এই বৈশিষ্ট্যটির পরিচিতি দেখুন ।


কি '.?' ? আমি মনে করি এটি সিদ্ধান্ত নেওয়া হয়েছিল যে এই বাক্য গঠনটি ব্যবহার করা সম্ভব হবে না। আমি কেবল '&' পেতে পারি। কাজ করতে.
কীথ বনেট

2
ঠিক যেমনটি আমি লিখেছিলাম .?এবং অন্যান্য বিকল্পগুলি বিবেচনা করা &.হয়েছিল তবে তা নির্বাচিত হয়েছিল! সুতরাং, শুধুমাত্র &.কাজ করবে।
উজবেজোন

ওহ, দুঃখিত, আমি শেষ অবধি ভাল করে পড়িনি। উদাহরণগুলির সঠিক বাক্য গঠন থাকলেও এটি আরও ভাল হত না?
কিথ বনেট

@ কিথবনেট আমি কী বলতে চাইছি তা দেখতে পাচ্ছি। আমার প্রথম উদাহরণটিতে আমার একটি টাইপ ছিল। আপনি ঠিক, এটা হতে হবে &.এবং .?আমার খারাপ। আমার উত্তর আপডেট। সতর্ক থাকুন জন্য ধন্যবাদ!
উজবেজোন

@ উজবাকজোন এজ এর উদাহরণে এখনও একটি টাইপ রয়েছে (বিকল্প 1): user.?profileহওয়া উচিত user&.profile(এটি নিজেই সম্পাদনা করতে পারছেন না কারণ এটি কেবল 1 অক্ষর সম্পাদনা!)।
ইয়ানিস ভাইলি

7

সতর্ক হতে হবে! নিরাপদ নেভিগেশন অপারেটর সুবিধাজনক হলেও এটির সাথে আপনার যুক্তি পরিবর্তন করার পক্ষে নিজেকে চালিত করাও সহজ। আমি প্রবাহ নিয়ন্ত্রণে এর ব্যবহার এড়ানো পরামর্শ দিচ্ছি। উদাহরণ:

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?আসলে একেবারেই ডাকা হবে না (এটি ||অপারেটর কীভাবে কাজ করে)। আপনার বাকী বাক্যটি সঠিক।
অলি বনেট

1
ওহ ভাল ধরা। আমি নিশ্চিত যে আমি কীভাবে এটি মিস করেছি। আমি আমার পোস্ট সংশোধন করব। ধন্যবাদ!
থমাস ডেরানেক

2
এটি সত্য যে ভুল যুক্তি ব্যবহার করা অনেক সহজ তবে আপনি এখানে বিভিন্ন জিনিস পরীক্ষা করছেন। দ্বিতীয় লাইনটি যদি স্ট্র্যান্ড অ্যান্ড স্ট্রিম্পটির সমতুল্য হয়? নীল নয় || খালি। নিরাপদ নেভিগেশন অপারেটরটি এখনও প্রবাহ নিয়ন্ত্রণের জন্য ব্যবহারের জন্য পুরোপুরি বৈধ puts "hello" unless str&.present?(কেবলমাত্র বর্তমানের জন্য রেল? পদ্ধতি)
স্যাম্পসন ক্রোলে

1

এটি নীল চেকের জন্য যেমন কোটলিন এবং সুইফ্টে ব্যবহৃত হয় উদাহরণস্বরূপ; অবজেক্ট -> সুইফট এবং কোটলিন সহ

model = car?.model

এই মডেলটি শূন্য (সুইফ্ট) বা নাল (কোটলিন) হতে পারে যদি আমরা গাড়ী শ্রেণিতে মডেল মানটি সংজ্ঞায়িত না করি। আমরা রুবিতে প্রশ্ন চিহ্নের পরিবর্তে সেই অ্যাম্পারস্যান্ড ব্যবহার করি

model = car&.model

যদি অ্যাম্পারস্যান্ড ছাড়াই car.model ব্যবহার করেন এবং যদি মডেল শূন্য থাকে তবে সিস্টেমটি চলতে পারে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.