क्या इसमें विपरीत शामिल है? रूबी एरे के लिए?


190

मुझे अपने कोड में निम्नलिखित तर्क मिले हैं:

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

@playersएक सरणी है। क्या कोई विधि है जिससे मैं बच सकता हूँ !?

आदर्श रूप में, यह स्निपेट होगा:

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

1
है doवैध गहरे लाल रंग का? मुझे एक त्रुटि मिलती है syntax error, unexpected end-of-input(यदि मैं हटाता हूं तो काम करता है do)
मैक्सिमू

एक सेट बनाम एक सरणी की खोज के लिए मानक के लिए stackoverflow.com/a/60404934/128421 देखें ।
टिन मैन

जवाबों:


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

ActiveSupport , और , के लिए exclude?विधि जोड़ता है । यह शुद्ध रूबी नहीं है, लेकिन बहुत सारे रूबिस्टों द्वारा उपयोग किया जाता है।ArrayHashString

स्रोत: सक्रिय समर्थन कोर एक्सटेंशन (रेल गाइड)



3
छोटी टिप्पणी: AS इसे Enumerable में जोड़ता है ताकि आप इसे सभी वर्गों के साथ उपयोग कर सकें जिनमें Enumerable शामिल है। हश के साथ भी। :)
user2422869

1
यह हरे रंग की
गुदगुदी

विधि अब 4.2.3 (और संभवतः पहले) रेल में ऑटो-लोड नहीं है, आपको इसकी आवश्यकता होगीrequire 'active_support/core_ext/enumerable'
डेनिस

96

हेयर यू गो:

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

आप इसी तरह की तकनीकों के बारे में अधिक जानकारी के लिए रूबी स्टाइल गाइड पर एक नज़र डाल सकते हैं ।


शैली गाइड के लिए Upvote। बस पठन सामग्री जो मुझे चाहिए थी।
जस्टनरिस

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

लेकिन जैसा कि ऊपर चक्कर आया 42, ऊपर ActiveSupport के उपयोग की exclude?आवश्यकता है


इसके लिए सिर्फ एक्टिव सपोर्ट के कोर एक्सटेंशन्स के इस्तेमाल की जरूरत है। guide.rubyonrails.org/v3.2/…
टिन मैन

0

कुछ इस तरह की कोशिश करो:

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

0

यह कोशिश करो, यह शुद्ध रूबी है इसलिए किसी भी परिधीय ढांचे को जोड़ने की कोई आवश्यकता नहीं है

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

मैं कुछ दिनों के लिए इसी तरह के तर्क के साथ संघर्ष कर रहा था, और कई मंचों और क्यू एंड ए बोर्डों की जांच करने के बाद इसका फायदा उठाने के लिए समाधान वास्तव में बहुत सरल था।


0

मैं इस पर खुद के लिए देख रहा था, यह पाया, और फिर एक समाधान। लोग भ्रमित करने वाले तरीकों और कुछ तरीकों का उपयोग कर रहे हैं जो कुछ स्थितियों में काम नहीं करते हैं या बिल्कुल भी नहीं।

मुझे पता है कि अब बहुत देर हो चुकी है, यह देखते हुए 6 साल पहले पोस्ट किया गया था, लेकिन उम्मीद है कि भविष्य के आगंतुकों को यह पता चलेगा (और उम्मीद है, यह उनके और आपके कोड को साफ कर सकता है।)

सरल समाधान:

if not @players.include?(p.name) do
  ....
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.