অন্তর্ভুক্ত এর বিপরীত আছে? রুবি অ্যারে জন্য?


190

আমি আমার কোডে নিম্নলিখিত যুক্তি পেয়েছি:

if !@players.include?(p.name)
  ...
end

@playersএকটি অ্যারে হয়। এমন কোন পদ্ধতি আছে যাতে আমি এড়াতে পারি !?

আদর্শভাবে, এই স্নিপেটটি হ'ল:

if @players.does_not_include?(p.name)
  ...
end

1
হয় doবৈধ রুবি? আমি একটি ত্রুটি syntax error, unexpected end-of-inputdo
পেয়েছি

একটি অ্যারে বনাম একটি সেট অনুসন্ধানের জন্য মাপদণ্ডের জন্য স্ট্যাকওভারফ্লো.com/ a/ 60404934/128421 দেখুন ।
টিন ম্যান

উত্তর:


369
if @players.exclude?(p.name)
    ...
end

ActiveSupport যোগ exclude?পদ্ধতি Array, Hashএবং String। এটি খাঁটি রুবি নয়, তবে প্রচুর রুবিবাদক ব্যবহার করেন।

উত্স: অ্যাক্টিভ সাপোর্ট কোর এক্সটেনশানস (রেল গাইড)



3
অপ্রাপ্তবয়স্ক মন্তব্য: এএস এটি পরিগণনযোগ্য হিসাবে যুক্ত করে যাতে আপনি এটি সমস্ত শ্রেণীর সাথে ব্যবহার করতে পারেন যার মধ্যে রয়েছে অনুমিত। এমনকি হাশের সাথেও। :)
ব্যবহারকারী 2422869

1
এটি সবুজ রঙের
টিকযুক্ত

পদ্ধতি আর স্বয়ং-লোড পাগল 4.2.3 (এবং সম্ভবত তার আগে), আপনি করার প্রয়োজন হবেrequire 'active_support/core_ext/enumerable'
ডেনিস

96

আপনি এখানে যান:

unless @players.include?(p.name)
  ...
end

অনুরূপ কৌশল সম্পর্কিত আরও তথ্যের জন্য আপনার কাছে রুবি স্টাইল গাইডটি দেখতে পাবেন


স্টাইল গাইডের জন্য আপভোট করুন। আমার প্রয়োজন পড়ার উপাদান মাত্র।
justnorris

1
একটি বিবৃতি জন্য পঠনযোগ্য। যদি আরও অনেক ভাল ব্যবহার অবহেলা! বা রুবি অ্যারে ক্লাসে আপনার নিজস্ব পদ্ধতি যুক্ত করুন।
রেনারস সিরোটিনস

3
বাদ দিতে এই পছন্দ? খাঁটি রুবি হিসাবে উত্তর দিন
dscher

1
যৌগিক শর্তের সাথে কাজ করার সময় এখনও অদ্ভুত। if flag unless @players.include?(p.name)বিশ্রী এবং if flag && !@players.include?(p.name)অবহেলা ব্যবহার করে।
গ্যাবে

1
ifকেবল trueশর্তটি পাস করার সময় , unlessপাস falseএবং দেয় nil। এটি কখনও কখনও ত্রুটিগুলি খুঁজে পাওয়া শক্ত করে। অতএব আমি পছন্দ করিexclude?
ToTenMilan

12

নিম্নলিখিতগুলি সম্পর্কে কীভাবে:

unless @players.include?(p.name)
  ....
end

মানুষ, এই সাইটে উত্তরগুলি যে গতিতে আসে তার সাথে, আমি জানি না যে আমি কোনও ভাল-ওলে ভাতিজাতিবাদ ছাড়া কোনও সুনাম অর্জন করব কিনা! :-D স্টাইল গাইড লিঙ্কটি একটি দুর্দান্ত স্পর্শ।
ইলাসনো

2
এটি দ্রুত হচ্ছে না। এটি পুরোপুরি হচ্ছে। (আমি খুঁজে পেয়েছি) =)
চার্লস ক্যালডওয়েল

11

কেবল রুবির দিকে তাকানো:

টি এল; ডিআর

তুলনার জন্য 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

7
module Enumerable
  def does_not_include?(item)
    !include?(item)
  end
end

ঠিক আছে, তবে গম্ভীরভাবে, যতক্ষণ না ঠিক কাজ করে।


1
+1 unlessএটি স্নিপেট দেখানো ঠিক আছে, তবে শর্তটি আরও জটিল হতে পারে। আমি মনে করি এই অবহেলিত পদ্ধতিগুলি ব্যবহার করা সহজ, তারা আরও ঘোষিত কোডের অনুমতি দেয়।
টোকল্যান্ড


1

আপনি কি ব্যবহার করতে পারেন:

unless @players.include?(p.name) do
...
end

unlessএর বিপরীত ifবা আপনি ব্যবহার করতে পারেন reject

আপনি rejectপ্রয়োজনীয় উপাদানগুলি করতে পারেন :

@players.reject{|x| x==p.name}

ফলাফল পাওয়ার পরে আপনি নিজের প্রয়োগটি করতে পারেন।


0

unlessএকক include?দফা সহ বিবৃতিগুলির জন্য ব্যবহার করা ভাল তবে উদাহরণস্বরূপ, যখন আপনাকে একটিতে কিছু না অন্যের অন্তর্ভুক্তি পরীক্ষা করা দরকার, তখন Arrayএর include?সাথে ব্যবহার exclude?করা আরও বন্ধুত্বপূর্ণ।

if @players.include? && @spectators.exclude? do
  ....
end

কিন্তু dizzy42 উপরে যেমন বলেছে, এর ব্যবহারের exclude?জন্য অ্যাক্টিভসপোর্ট প্রয়োজন


এটির জন্য কেবল সক্রিয় সহায়তার মূল এক্সটেনশানগুলির ব্যবহার প্রয়োজন। গাইডস.আরবিওনরইলস.অর্গ
২…

0

এরকম কিছু চেষ্টা করুন:

@players.include?(p.name) ? false : true

0

এটি চেষ্টা করুন, এটি খাঁটি রুবি তাই কোনও পেরিফেরিয়াল ফ্রেমওয়ার্ক যুক্ত করার দরকার নেই

if @players.include?(p.name) == false do 
  ...
end

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


0

আমি নিজের জন্য এটি সন্ধান করছি, এটি খুঁজে পেয়েছি এবং তারপরে একটি সমাধান। লোকেরা বিভ্রান্তিমূলক পদ্ধতি এবং এমন কিছু পদ্ধতি ব্যবহার করছে যা নির্দিষ্ট পরিস্থিতিতে কাজ করে না বা আদৌ নয়।

আমি জানি 6 বছর আগে এটি পোস্ট হয়েছে বিবেচনা করে এখনই অনেক দেরি হয়ে গেছে, তবে আশা করি ভবিষ্যতের দর্শকরা এটি খুঁজে পাবেন (এবং আশা করি, এটি তাদের এবং আপনার কোড সাফ করতে পারে) can

সহজ সমাধান:

if not @players.include?(p.name) do
  ....
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.