2013-01-14 24 views
15

रूबी में शामिल होने जैसे कई बूलियन अभिव्यक्तियों का मूल्यांकन करें, आप Array#join का उपयोग वैकल्पिक डिलीमीटर के साथ कई स्ट्रिंग्स में शामिल होने के लिए कर सकते हैं।रूबी

[ "a", "b", "c" ].join  #=> "abc" 
[ "a", "b", "c" ].join("-") #=> "a-b-c" 

मैं सोच रहा हूँ अगर वहाँ बूलियन अभिव्यक्ति का एक समूह के साथ इसी तरह कुछ करने के लिए अच्छा वाक्यात्मक चीनी। उदाहरण के लिए, मुझे && अभिव्यक्तियों का एक गुच्छा एक साथ होना चाहिए। हालांकि, किस अभिव्यक्ति का उपयोग किया जाएगा उपयोगकर्ता इनपुट द्वारा निर्धारित किया जाता है। तो बजाय

cumulative_value &&= expression[:a] if user[:input][:a] 

का एक समूह ऐसा करने का मैं सभी भाव पहले इनपुट के आधार पर है, तो && उन सब को एक साथ एक ही बार में इकट्ठा करने के लिए चाहते हैं। कुछ ऐसा:

be1 = x > y 
be2 = Proc.new {|string, regex| string =~ regex} 
be3 = z < 5 && my_object.is_valid? 
[be1,be2.call("abc",/*bc/),be3].eval_join(&&) 

क्या रूबी में डिफ़ॉल्ट रूप से ऐसा कोई डिवाइस है? यदि संभव हो तो मैं कोड क्लीनर को कुछ सिंथेटिक चीनी चाहता हूं।

+1

क्या आप चाहते हैं कि प्रत्येक भाग तर्क लेता है और गतिशील रूप से बदलता है, या क्या वे पहले निर्धारित किए गए हैं? उदाहरण के लिए 'be1' तब तक समझ में नहीं आता है जब तक कि' x' और 'y' पहले ही नहीं दिया जाता है, इस स्थिति में यह 'सत्य' या 'झूठी' का निरंतर होगा, लेकिन' be2' एक proc है, जो हमेशा मूल्यांकन करता है एक truethy मूल्य के लिए, जो एक स्थिर भी है, और जब तक आप कुछ तर्कों को लागू करने जा रहे हैं, तब तक ज्यादा समझ नहीं आएगा। ऐसा लगता है कि आप इन्हें मिला रहे हैं। – sawa

उत्तर

24

Array#all? आज़माएं। यदि arr बूलियन्स की एक सारणी है, इस से ही काम करता है:

arr.all? 

true वापस आ जाएगी अगर arr में हर तत्व सच है, या false अन्यथा।

आप || पर सरणी में शामिल होने, जो है के लिए एक ही तरीके से Array#any? उपयोग कर सकते हैं, यह true लौटाता है यदि सरणी में किसी भी तत्व नहीं तो सच है और false

यह भी अगर arr, Procs की एक सरणी है जब तक आप ब्लॉक में Proc#call करने के लिए सही चर पारित (या वर्ग, उदाहरण के लिए, या वैश्विक चर का उपयोग करें) करने के लिए सुनिश्चित करें कि काम करेंगे।

17

आप इस लक्ष्य को हासिल करने के लिए #all?, #any? और #none? उपयोग कर सकते हैं:

[true, false].any? 
=> true 

[true, false].all? 
=> false 

और भूल नहीं है, कि nul और false के अलावा अन्य सभी मूल्यों true का मूल्यांकन।

cumulative_value = expression.select {|k, v| user[:input][k] }.values.all? 

यह पहली सभी का चयन करेंगे:

['', [], {}].all? 
=> true 
+0

यह आश्चर्यजनक है! इसे जानना वास्तव में अच्छा है। –

2

इस विशेष मामले में, आप सिर्फ उन है जो उपयोगकर्ता का चयन किया है के आधार पर आपके भाव हैश को फिल्टर, और उसके बाद का परीक्षण करता है, तो उन सभी भाव truthy हैं करना चाहते हैं अभिव्यक्ति के सदस्य जिनके लिए मिलान user[:input] कुंजी है, तो यह परीक्षण करने के लिए Array#all? का उपयोग करेगा यदि चयनित अभिव्यक्तियों के सभी मान सत्य हैं। आपका cumulative_value या तो सत्य या गलत है।

आपकी अभिव्यक्ति मूल्यों procs हो सकता है के बाद से, आप तो फ़िल्टर्ड अभिव्यक्ति सूची से सभी procs का मूल्यांकन करने के लिए होता है, और उस से एक परिणाम सरणी है, जो आप पर all? कॉल कर सकते हैं का निर्माण:

cumulative_value = expression.select {|k, v| user[:input][k] }. 
    values.map {|value| value.is_a?(Proc) ? value.call : value }.all? 

शायद ही " वाक्य रचनात्मक चीनी ", लेकिन यह काम जटिल हो जाता है बिना जटिल जटिल।