मुझे अपने कोड में निम्नलिखित तर्क मिले हैं:
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?विधि जोड़ता है । यह शुद्ध रूबी नहीं है, लेकिन बहुत सारे रूबिस्टों द्वारा उपयोग किया जाता है।ArrayHashString
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
लेकिन जैसा कि ऊपर चक्कर आया 42, ऊपर ActiveSupport के उपयोग की exclude?आवश्यकता है
यह कोशिश करो, यह शुद्ध रूबी है इसलिए किसी भी परिधीय ढांचे को जोड़ने की कोई आवश्यकता नहीं है
if @players.include?(p.name) == false do
...
end
मैं कुछ दिनों के लिए इसी तरह के तर्क के साथ संघर्ष कर रहा था, और कई मंचों और क्यू एंड ए बोर्डों की जांच करने के बाद इसका फायदा उठाने के लिए समाधान वास्तव में बहुत सरल था।
मैं इस पर खुद के लिए देख रहा था, यह पाया, और फिर एक समाधान। लोग भ्रमित करने वाले तरीकों और कुछ तरीकों का उपयोग कर रहे हैं जो कुछ स्थितियों में काम नहीं करते हैं या बिल्कुल भी नहीं।
मुझे पता है कि अब बहुत देर हो चुकी है, यह देखते हुए 6 साल पहले पोस्ट किया गया था, लेकिन उम्मीद है कि भविष्य के आगंतुकों को यह पता चलेगा (और उम्मीद है, यह उनके और आपके कोड को साफ कर सकता है।)
सरल समाधान:
if not @players.include?(p.name) do
....
end
doवैध गहरे लाल रंग का? मुझे एक त्रुटि मिलती हैsyntax error, unexpected end-of-input(यदि मैं हटाता हूं तो काम करता हैdo)