রুবি: ভেরিয়েবল বনাম যদি ভ্যারিয়েবল.নিল?


11

আমি রুবির কাছে নতুন এবং আমি যখন অবাক হলাম তখন জানতে পেলাম যে সমস্ত বস্তু শূন্য ও মিথ্যা বাদে সত্য। এমনকি 0 টি সত্য।

ভাষার সম্পত্তি সম্পর্কে একটি দুর্দান্ত জিনিস আপনি লিখতে পারেন:

if !variable
  # do stuff when variable is nil
end

আমার সহকর্মীরা, যারা বেশি পাকা রুবি বিকাশকারী, তারা জোর দিয়ে বলছেন যে .nil ব্যবহার না করে আমার এটি বেছে নেওয়া উচিত? তাই ভালো:

if variable.nil?
  # do stuff when variable is nil
end

তবে আমি বিশ্বাস করি যে দ্বিতীয়টি দুটি কারণে ভাল বিকল্প: ১. আমি মনে করি এটি বেশি অবলম্বনযুক্ত, বিশেষত রুবির মতো ভাষায় যেখানে সবকিছুই একটি বিষয় এবং বার্তা বিনিময়। ২. এটি আমার পাঠ্যক্রমের মতামত অনুসারে কম কমপ্যাক্ট হলেও আরও পঠনযোগ্য।

আমি কি এখানে "নবাগত" ভুল করছি?


4
আপনি শূন্য জন্য পরীক্ষা করছেন? নাকি ভুয়া মূল্য?

আমি শূন্য জন্য পরীক্ষা করছি। মূলত চলকটি যদি শূন্য হয় তবে আমি কিছু করি (বা না)
জাভিয়ের হলগিরা

3
আপনি যদি শূন্যের জন্য পরীক্ষা নিরীক্ষা করেন তবে আপনি কেন মিথ্যা পরীক্ষার জন্য সেই ব্লকে প্রবেশ করতে চান?

সম্মত হন, আমি .nil পছন্দ করার আরেকটি কারণ হিসাবে উল্লেখ করেছি? তবে তারা জোর দিয়েছিল যে "যদি ভেরিয়েবল

উত্তর:


17

আপনি যা বলতে চাইছেন তা লিখুন। আপনি যা লিখছেন তা বোঝাতে

আলাদা পরীক্ষা দিতে দেয়। .vowel?

if char == 'a'
   # do stuff
end

বনাম

if char.vowel?
   # do stuff
end

এখন, এটি সুস্পষ্ট যে এগুলি একই কাজ করে না। কিন্তু আপনি যদি শুধুমাত্র আশা করছেন charহতে aবা bএটি কাজ করবে। তবে এটি পরবর্তী বিকাশকারীকে বিভ্রান্ত করবে - দ্বিতীয় ব্লকটি সেই অবস্থার জন্য প্রবেশ করা হবে যেখানে চরটিও রয়েছে [eiou]। তবে এর জন্য a, এটি সঠিকভাবে কাজ করবে।

হ্যাঁ, এটা কেনার ক্ষেত্রে দেখা যায় যে nilfalseরুবি একমাত্র falsy মান। যাইহোক, আপনি পরীক্ষা করে জন্য nilজন্য পরীক্ষার দ্বারা nil || false, এই কি আপনি কি বোঝাতে চেয়েছেন করা হয় না।

এর অর্থ হ'ল পরের বিকাশকারী (যিনি আপনার ঘরের ঠিকানা জানে এমন একজন পাগল কুড়াল খুন বলে মনে হয়) কোডটি পড়বে এবং কেন falseসেখানেও প্রবেশ করা উচিত তা অবাক করে।

কোড বহন লিখুন ঠিক আপনি কি বলতে চাইছেন।


3

নিম্নোক্ত বিবেচনা কর:

response = responses.to_a.first

এটি responses, বা এর প্রথম উপাদানটি ফিরিয়ে দেবে nil। তারপরে শর্তযুক্ত বিবৃতিগুলি আমরা nilযেমন falseলিখতে পারি তেমন আচরণ করে :

response = responses.to_a.first
if response
  # do something ('happy path')
else
  # do something else
end

যা এর চেয়ে বেশি পঠনযোগ্য:

if response.nil?
  # do something else
else
  # do something ('happy path')
end

if (object)প্যাটার্ন রুবি কোডে খুব সাধারণ। এটি রিফ্যাক্টরিংয়ের দিকেও দুর্দান্তভাবে নেতৃত্ব দেয়, যেমন:

if response = responses.to_a.first
  do_something_with(response)
else
  # response is equal to nil
end

এটিও মনে রাখবেন যে একটি রুবি পদ্ধতি nilডিফল্টরূপে ফিরে আসে । তাই:

def initial_response
  if @condition
    @responses.to_a.first
  else
    nil
  end
end

এটিকে সরল করা যায়:

def initial_response
  if @condition
    @responses.to_a.first
  end
end

সুতরাং আমরা আরও চুল্লি করতে পারি:

if response = initial_response
  do_something_with(response)
else
  # response is equal to nil
end

এখন আপনি যুক্তি দিতে পারেন যে ফিরে nilআসা সর্বদা সেরা ধারণা নয়, কারণ এর অর্থ nilসর্বত্র অনুসন্ধান করা। তবে তা হ'ল মাছের আর একটি কেটলি। বস্তুর "উপস্থিতি বা অনুপস্থিতি" জন্য পরীক্ষা করা যেমন একটি ঘন ঘন প্রয়োজন, এই বিষয়টির সত্যতা রুবির একটি দরকারী দিক, যদিও ভাষার ক্ষেত্রে আগতদের পক্ষে আশ্চর্যজনক।


2

কেবল if variable.nil?প্রাকৃতিক ভাষার মতোই পড়া হয় না , এটি কোনও প্রোগ্রামারকে দুর্ঘটনাক্রমে এটিকে একটি falseমূল্য নির্ধারণ করে এবং আপনার ifবিবৃতিতে পড়ার বিরুদ্ধেও রক্ষা করে , যেহেতু রুবি একটি স্বচ্ছভাবে টাইপ করা ভাষা।


1
তাহলে মূল প্রশ্নের প্রাথমিক মন্তব্যটি ভুল ছিল? "ভেরিয়েবল শূন্য বা মিথ্যা হলে জিনিসগুলি করা উচিত ছিল"? কোড যেহেতু মিলছে না মন্তব্য একটি বাগ, তাই সরাসরি একটি বাগ আছে?
gnasher729

সঠিক। একটি সাধারণ সত্যতা পরীক্ষা লজিক ত্রুটিগুলি প্রবর্তন করতে পারে।
গ্রেগ বার্গার্ড্ট

0

আইডোমেটিকভাবে, unless variableতার চেয়ে বেশি পছন্দনীয় if !variable। নেতিবাচক ifবিবৃতিগুলি প্রায়শই একটি কোডের গন্ধ হিসাবে বিবেচিত হয় কারণ স্কিমিংয়ের সময় অস্বীকৃতিটি মিস করা সহজ।

এখানে বড় চিত্রটি হ'ল এর nilমতো চেক করাও কোড গন্ধের কিছুটা। যথাযথ ওওর জন্য, নাল অবজেক্ট প্যাটার্নটি ব্যবহার করার লক্ষ্য রাখুন যাতে এই ধরণের চেকের প্রয়োজন হয় না। http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/

কী করতে হবে তা অবজেক্টগুলিকে বলুন, তারা কী তা জিজ্ঞাসা করবেন না। কখনও কখনও এটি জিজ্ঞাসা করবেন না বলে পরিচিত

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