2010-03-01 10 views
7

मान लीजिए कि मेरे पास मूल्यों की एक सरणी है [ए, बी, सी, डी, ...] और एक फ़ंक्शन f (x, ...) जो सत्य या गलत लौटाता है।सूची में और उसके लिए सबसे अच्छा कार्यात्मक दृष्टिकोण

[1,2,3,4].map {|x| f(x)} => [true true false true] 

सबसे पहले, परिणामी सूची को सही या गलत मूल्य (AND के माध्यम से) में संक्षिप्त करने का सबसे अच्छा तरीका क्या है?

[true true false true] 

लिए:

((true && true) && false) && true 

द्विआधारी & & ऑपरेटर का संचयी जोड़ी के लिहाज से अनुप्रयोग का उपयोग वहाँ एक समारोह है कि मुझे मैप करने के लिए अनुमति होगी है?

इस मामले में फ़ंक्शन का मूल्यांकन करने की लागत प्रतिस्थापन है, इसलिए तर्कसंगत रूप से तर्कों (फ़ंक्शन एप्लिकेशन) का मूल्यांकन करने के लिए एक लिस्पी-शैली "और" का उपयोग करना चाहते हैं जब तक कि उनमें से कोई झूठा न हो। निर्धारित किया गया है कि:

!![1,2,3,4].each {|x| break false if !f(x) } 

जो बदसूरत है। उम्मीद है कि ऐसा करने के लिए एक और शानदार तरीका है। मुझे पता है कि मैं ऐरे को एक नई समझ जोड़ सकता हूं, लेकिन उम्मीद कर रहा हूं कि इसमें कुछ अंतर्निहित है जो इससे बेहतर होता है। धन्यवाद

उत्तर

12

आप Enumerable#all? की तलाश में हैं, जो सच है कि इसके ब्लॉक के सभी आमंत्रण सत्य हैं। , भी Enumerable#any? नहीं है जो सच रिटर्न अगर इसकी ब्लॉक के आमंत्रण के किसी भी truthy हैं:

#!/usr/bin/ruby1.8 

def even(n) 
    n % 2 == 0 
end 

p [1, 2, 3, 4].all? { |i| even(i) } # => false 
p [2, 4, 6, 8].all? { |i| even(i) } # => true 
p [1, 2, 3, 4].any? { |i| even(i) } # => true 
p [1, 3, 5, 7].any? { |i| even(i) } # => false 

any? शॉर्ट curcuits: पहला truthy मूल्य यह सच वापस जाने के लिए कारण बनता है। तो all? शॉर्ट सर्किट है: पहला झूठा मूल्य इसे झूठी वापसी का कारण बनता है।

+0

नाइटपिकिंग के लिए खेद है, लेकिन 'फिक्सनम' में पहले से ही विधियां हैं 'और' विषम? '...;) –

+0

@Mladen Jablanovic, अच्छा बिंदु। इस उदाहरण के लिए मैं एक उपयोगकर्ता परिभाषित समारोह चाहता था। –

1

के बारे में कैसे: [true, true, false, true].all?

यह सच लौट यदि सरणी कुछ भी गलत या नहीं के बराबर का मूल्यांकन शामिल नहीं करता होगा।

3

आप अपने सरणी तह की कोशिश कर सकते:

[true,true,false,true].inject(:&) #=> false (AND-ed) 
[true,true,false,true].inject(:|) #=> true (OR-ed) 
[1,2,3,4].inject(:+)    #=> 10 (summed) 
[1,2,3,4].inject(:*)    #=> 24 (multiplied) 

आप सुराग मिलता है। अपने उदाहरण पर वापस जाएं:

[1,2,3,4].map {|x| f(x) }.inject(:&) 

हालांकि यह शॉर्टकटकिट नहीं होगा - आप शायद "किसी भी" में बेहतर दिखेंगे? या "सब?" आपके "एफ()" को छोड़कर साइड इफेक्ट्स (जैसे लगातार स्टोरेज को संशोधित करना) है।

+0

धन्यवाद, यह पहला सवाल जवाब देता है! वेन का दूसरा जवाब है। –

संबंधित मुद्दे