আমি আমার কোডে নিম্নলিখিত যুক্তি পেয়েছি:
if !@players.include?(p.name)
...
end
@playersএকটি অ্যারে হয়। এমন কোন পদ্ধতি আছে যাতে আমি এড়াতে পারি !?
আদর্শভাবে, এই স্নিপেটটি হ'ল:
if @players.does_not_include?(p.name)
...
end
আমি আমার কোডে নিম্নলিখিত যুক্তি পেয়েছি:
if !@players.include?(p.name)
...
end
@playersএকটি অ্যারে হয়। এমন কোন পদ্ধতি আছে যাতে আমি এড়াতে পারি !?
আদর্শভাবে, এই স্নিপেটটি হ'ল:
if @players.does_not_include?(p.name)
...
end
উত্তর:
if @players.exclude?(p.name)
...
end
ActiveSupport যোগ exclude?পদ্ধতি Array, Hashএবং String। এটি খাঁটি রুবি নয়, তবে প্রচুর রুবিবাদক ব্যবহার করেন।
require 'active_support/core_ext/enumerable'
আপনি এখানে যান:
unless @players.include?(p.name)
...
end
অনুরূপ কৌশল সম্পর্কিত আরও তথ্যের জন্য আপনার কাছে রুবি স্টাইল গাইডটি দেখতে পাবেন ।
if flag unless @players.include?(p.name)বিশ্রী এবং if flag && !@players.include?(p.name)অবহেলা ব্যবহার করে।
ifকেবল trueশর্তটি পাস করার সময় , unlessপাস falseএবং দেয় nil। এটি কখনও কখনও ত্রুটিগুলি খুঁজে পাওয়া শক্ত করে। অতএব আমি পছন্দ করিexclude?
নিম্নলিখিতগুলি সম্পর্কে কীভাবে:
unless @players.include?(p.name)
....
end
কেবল রুবির দিকে তাকানো:
টি এল; ডিআর
তুলনার জন্য none?এটি একটি ব্লক পাসিং ব্যবহার করুন ==:
[1, 2].include?(1)
#=> true
[1, 2].none? { |n| 1 == n }
#=> false
Array#include?একটি যুক্তি গ্রহণ করে এবং ==অ্যারের প্রতিটি উপাদানগুলির বিরুদ্ধে পরীক্ষা করতে ব্যবহার করে:
player = [1, 2, 3]
player.include?(1)
#=> true
Enumerable#none?একটি যুক্তিও গ্রহণ করতে পারে যে ক্ষেত্রে এটি ===তুলনার জন্য ব্যবহার করে। বিপরীত আচরণ পেতে include?আমরা প্যারামিটারটি বাদ ==দিয়ে তুলনার জন্য এটি ব্যবহার করে একটি ব্লক পাস করি ।
player.none? { |n| 7 == n }
#=> true
!player.include?(7) #notice the '!'
#=> true
উপরের উদাহরণে আমরা আসলে ব্যবহার করতে পারি:
player.none?(7)
#=> true
এটি কারণ Integer#==এবং Integer#===সমতুল্য। তবে বিবেচনা করুন:
player.include?(Integer)
#=> false
player.none?(Integer)
#=> false
none?আয় falseকারণ Integer === 1 #=> true। তবে সত্যিই একটি বৈধ notinclude?পদ্ধতি ফিরে আসা উচিত true। আমরা যেমন আগে করেছি:
player.none? { |e| Integer == e }
#=> true
module Enumerable
def does_not_include?(item)
!include?(item)
end
end
ঠিক আছে, তবে গম্ভীরভাবে, যতক্ষণ না ঠিক কাজ করে।
unlessএটি স্নিপেট দেখানো ঠিক আছে, তবে শর্তটি আরও জটিল হতে পারে। আমি মনে করি এই অবহেলিত পদ্ধতিগুলি ব্যবহার করা সহজ, তারা আরও ঘোষিত কোডের অনুমতি দেয়।
ব্যবহার unless:
unless @players.include?(p.name) do
...
end
unlessএকক include?দফা সহ বিবৃতিগুলির জন্য ব্যবহার করা ভাল তবে উদাহরণস্বরূপ, যখন আপনাকে একটিতে কিছু না অন্যের অন্তর্ভুক্তি পরীক্ষা করা দরকার, তখন Arrayএর include?সাথে ব্যবহার exclude?করা আরও বন্ধুত্বপূর্ণ।
if @players.include? && @spectators.exclude? do
....
end
কিন্তু dizzy42 উপরে যেমন বলেছে, এর ব্যবহারের exclude?জন্য অ্যাক্টিভসপোর্ট প্রয়োজন
এটি চেষ্টা করুন, এটি খাঁটি রুবি তাই কোনও পেরিফেরিয়াল ফ্রেমওয়ার্ক যুক্ত করার দরকার নেই
if @players.include?(p.name) == false do
...
end
আমি কয়েক দিনের জন্য একই অনুরূপ যুক্তি দিয়ে লড়াই করেছিলাম, এবং কয়েকটি ফোরাম এবং প্রশ্নোত্তর বোর্ডগুলি সামান্য উপকারের জন্য চেক করার পরে এটি প্রমাণিত হয় যে সমাধানটি আসলে বেশ সহজ ছিল।
আমি নিজের জন্য এটি সন্ধান করছি, এটি খুঁজে পেয়েছি এবং তারপরে একটি সমাধান। লোকেরা বিভ্রান্তিমূলক পদ্ধতি এবং এমন কিছু পদ্ধতি ব্যবহার করছে যা নির্দিষ্ট পরিস্থিতিতে কাজ করে না বা আদৌ নয়।
আমি জানি 6 বছর আগে এটি পোস্ট হয়েছে বিবেচনা করে এখনই অনেক দেরি হয়ে গেছে, তবে আশা করি ভবিষ্যতের দর্শকরা এটি খুঁজে পাবেন (এবং আশা করি, এটি তাদের এবং আপনার কোড সাফ করতে পারে) can
সহজ সমাধান:
if not @players.include?(p.name) do
....
end
doবৈধ রুবি? আমি একটি ত্রুটিsyntax error, unexpected end-of-inputdo