কম্পিউটার

প্রতিটি... অন্যথায়

আমি each ভালোবাসি , কিন্তু আমার এটির সাথে একটি সমস্যা আছে। আপনার কাছে একটি খালি সংগ্রহ থাকলে কী হয়?

আপনি যদি [].each কল করেন , কিছুই হবে না এবং [] ফেরত দেওয়া হবে। কখনও কখনও, আপনি যা চান তা। কিন্তু প্রায়শই, বিশেষ করে যখন আপনি UI তৈরি করছেন, আপনি খালি তালিকাগুলিকে একটি বিশেষ উপায়ে পরিচালনা করতে চাইবেন৷ উদাহরণস্বরূপ, যখন আমার কাছে কোনো ডেটা থাকে না তখন আমি সাধারণত একটি ভিন্ন বার্তা দেখাতে চাই৷

কিন্তু যেহেতু [].each [] ফেরত দেয় , nil নয় , আপনি এইরকম কিছু লিখতে আটকে আছেন:

app/views/users/index.html.erb
<% if @users.empty? -%>
  <p>You don't have any users. <%= link_to "Add one!", new_user_path %></p>
<% else -%>
  <% @users.each do |user| -%>
      <p><%= user.name %></p>
  <% end -%>
<% end -%>

যে কাজ করে, কিন্তু এটা বিশ্রী লাগে. আমি বরং বলব, "এই সংগ্রহের প্রতিটি আইটেমের সাথে এই জিনিসটি করুন, যদি না এতে কিছু না থাকে, সেক্ষেত্রে এই অন্য জিনিসটি সম্পূর্ণরূপে করুন।" আমি each এর মত কিছু চাই , একটি "অথবা অন্য।" সহ

রেন্ডারিং রেল সংগ্রহ

আপনার মতামত ভিতরে, রেল সাহায্য করতে পারে. জিনিসগুলির সংগ্রহ রেন্ডার করার ক্ষেত্রে এটি দুর্দান্ত:

app/views/users/index.html.erb
<%= render @users %>
app/views/users/_user.html.erb
<p><%= user.name %></p>

যখন render পাস করা হয়েছে @users , এটি _user.html.erb রেন্ডার করে @users-এর ভিতরে প্রতিটি ব্যবহারকারীর জন্য একবার . আপনি each এড়িয়ে যেতে পারেন সম্পূর্ণরূপে।

বোনাস হিসাবে, যদি @users খালি, render nil ফেরত দেয় , ঠিক যেমন আমরা চাই! সুতরাং আপনি এটি লিখতে পারেন, এবং মূল সংস্করণের মতো একই আউটপুট পেতে পারেন:

app/views/users/index.html.erb
<%= render(@users) || render('empty') %>
app/views/users/_user.html.erb
<p><%= user.name %></p>
app/views/users/_empty.html.erb
<p>You don't have any users. <%= link_to "Add one!", new_user_path %></p>

এটি অনেক বেশি সরাসরি, একবার আপনি রেলের কনভেনশনগুলি বুঝতে পারলে।

একটি দৃশ্যের বাইরে কী হবে?

আপনি যদি Rails অনুসরণ করেন, render একটি সংগ্রহের সাথে বস্তুর সংগ্রহ রেন্ডার করার একটি দ্রুত, শক্তিশালী উপায়৷

কিন্তু কখনও কখনও আপনি প্রতিটি আইটেম রেন্ডার করার জন্য একটি অতিরিক্ত আংশিক মোকাবেলা করতে চান না। অথবা render আপনার নকশা সমর্থন করবে না। অথবা আপনি একটি দৃশ্যের ভিতরেও থাকবেন না।

আমি এখন পর্যন্ত যে সেরা সমাধান পেয়েছি তা হল presence .

list.presence একই রকম:

if list.present?
  list
else
  nil
end

অর্থাৎ, তালিকাটিতে কিছু থাকলে আপনি সেটি ফিরে পাবেন এবং nil যদি এটি খালি হয়।

presence সহ , আপনি লিখতে পারেন:

@users.each do |user|
  puts user.name
end.presence || puts("You don't have any users.")

এটি প্রতিটি নাম প্রিন্ট করে যদি @users-এ ব্যবহারকারী থাকে , অথবা You don't have any users অন্যথায়।

তবুও, আমি presence ছাড়াই করতে পারতাম . এটি একটি হ্যাক মত মনে হয়, কারণ এটি একটি. যদি এটি সমর্থিত হয়, তাহলে এরকম কিছু ভালো হতে পারে:

@users.each do |user|
  puts user.name
end || puts("You don't have any users.")

অথবা Smalltalk-ish:

@users.each(if_empty: lambda { puts "You don't have any users." }) do |user|
  puts user.name
end

অথবা এমনকি (হাঁপাও!):

for user in @users
  puts user.name
else
  puts "You don't have any users."
end

আপাতত, যদিও, আমি সাধারণত শুধু presence দিয়ে যাই অথবা মৌলিক if blank?; else each প্যাটার্ন।

আপনি কোনটি ভাল মনে করেন? আপনি কিভাবে খালি তালিকা পরিচালনা করবেন? আপনি একটি ভাল উপায় খুঁজে পেয়েছেন? যদি তাই হয়, আমাকে এটা সম্পর্কে বলুন!


  1. জাভাস্ক্রিপ্টে শর্তসাপেক্ষ বিবৃতি

  2. পিএইচপি-তে প্রতিটি() ফাংশন

  3. C# এ একটি স্ট্রিংয়ে প্রতিটি শব্দের ফ্রিকোয়েন্সি খুঁজুন

  4. IF কমান্ড... SQL সার্ভারে ELSE